• ベストアンサー

MySQLのテーブル設計で迷っています(桁数)

MySQLのテーブル設計で迷っています。 クリエイト文のカッコの中は桁数を表しているのでしょうか?それともバイト数でしょうか?桁数であれば、それぞれの型で何桁まで設定できますでしょうか? int型のnoを18桁に変更したいのですが、調べているうちに迷ってしまいました。 型 バイト 最小値 最大値 TINYINT 1 -128 127 SMALLINT 2 -32768 32767 MEDIUMINT 3 -8388608 8388607 INT 4 -2147483648 2147483647 BIGINT 8 -9223372036854775808 9223372036854775807 CREATE TABLE `user` ( `no` int(8) unsigned NOT NULL auto_increment, `id` varchar(24) NOT NULL default '', `email` varchar(255) NOT NULL default '', `reg_date` datetime NOT NULL default '0000-00-00 00:00:00', PRIMARY KEY (`no`) ) TYPE=MyISAM;

質問者が選んだベストアンサー

  • ベストアンサー
回答No.3

#1さんの回答で、 >文字列型はバイト数ですが、数値型の場合は表示桁数です。 とありますが、MySQL 4.1を境に仕様変更されています。 char(10)の場合、 ~MySQL 4.0→10バイト MySQL 4.1~→10文字

fabu
質問者

補足

ご回答ありがとうございます。 文字型は文字数なのですね。数値型の桁数は以下であっていますでしょうか? TINYINT 3桁 SMALLINT 5桁 MEDIUMINT 8桁 INT 10桁 BIGINT 19桁

その他の回答 (2)

  • mahny
  • ベストアンサー率74% (57/77)
回答No.2

#1です。 > 例えば、こんなテーブルを作って… 試したらエラーでした。すいません。書き直します。 質問者様のテーブルを拝借して… CREATE TABLE `user` ( `no` int(8) unsigned zerofill NOT NULL auto_increment, `id` varchar(24) NOT NULL default '', `email` varchar(255) NOT NULL default '', `reg_date` datetime NOT NULL default '0000-00-00 00:00:00', PRIMARY KEY (`no`) ) ENGINE=MyISAM; これにデータを追加 INSERT user(id, email) VALUES('test-user', 'test@exsample.com'); 読み出す。 mysql> SELECT * FROM user; +----------+-----------+-------------------+---------------------+ | no | id | email | reg_date | +----------+-----------+-------------------+---------------------+ | 00000001 | test-user | test@exsample.com | 0000-00-00 00:00:00 | +----------+-----------+-------------------+---------------------+ 1 row in set (0.00 sec) ↑ゼロを追加されて'no'の内容を8桁表示になっている。テキストがズレているのは気にしない方向で…

fabu
質問者

お礼

ご回答ありがとうございます。 参考になりました。

  • mahny
  • ベストアンサー率74% (57/77)
回答No.1

> クリエイト文のカッコの中は桁数を表しているのでしょうか? > それともバイト数でしょうか? 文字列型はバイト数ですが、数値型の場合は表示桁数です。 カッコの数値を変えても記憶領域は変えられません。 数値型のカッコは主にZEROFILLと組み合わせて使われるようです。 質問の18桁の数値が保持したいなら素直にBIGINTを使うか、 verchar等の文字型で代用する事になると思います。 例えば、こんなテーブルを作って… CREATE TABLE `user` (  `no` int(8) unsigned zerofill NOT NULL auto_increment ) TYPE=MyISAM; INSERT user(no) VALUES(1); でデータを作った場合 SELECT * FROM user; +----------+ | no    | +----------+ | 00000001 | +----------+ 1 rows in set (0.00 sec) こんなんなります。また… INT unsign の上限は 4294967295 ですので INSERT user(no) VALUES(4294967296); はエラーになります。 保持できるデータ型の範囲は参照URLをどぞ。

参考URL:
http://dev.mysql.com/doc/refman/5.1/ja/data-types.html

関連するQ&A