よくやらかすので備忘録として残しておきます。
MySQLのテーブル定義には、INTEGERなど整数型・文字型などで()に桁数がつくパターンとつかないものがあります。
数値型に関しては、()
の中身が最大桁数を示すものではないので、Oracleの知識などで考えるとミスを起こすことがあります。
例えば以下のようなテーブルを考えてみます。
CREATE TABLE `column_max_size` (
`id` int NOT NULL AUTO_INCREMENT,
`column_int` int(11) unsigned zerofill DEFAULT NULL,
`column_tinyInt` tinyint(1) DEFAULT NULL,
`column_varchar` varchar(255) DEFAULT NULL,
`column_int_2` int(8) unsigned zerofill DEFAULT NULL,
`column_int_default` int DEFAULT NULL,
`column_tinyInt_default` tinyint DEFAULT NULL,
PRIMARY KEY (`id`)
)
これの最大値を入れると以下のようなデータになります。
少なくともtinyintだったら最大が「1桁」ではないですね。
※varcharは見切れていますが、255文字入っています。
MySQLのINTやtinyIntの桁数は決まっている
Oracleユーザーであれば、後ろの(10)
などを見ると「最大桁数」と捉えてしまいがちですが、
MySQLでは必ず最大桁数、というわけではなく違う意味を持ちます。
http://dbinfo.sakura.ne.jp/?contents_id=102
INTやtinyintなどの整数型は最大桁数が決まっています。
MySQLではINTやtinyIntは以下のように、最大値・最小値が決まっています。
というものの、整数型によって確保するバイト領域が決まっているため、その範囲が最小~最大となります。
https://dev.mysql.com/doc/refman/5.6/ja/integer-types.html
では、後ろの(10)
は何を示すのか?
()の中身の意味はそれぞれで異なる。
INTなどの()は桁数ですが、この桁数部分は表示桁数です。
例えば、以下のような定義に関して、データの1を登録した場合は00000001
という表示になります。
なぜなら、zerofill
オプションが付いているので、(8)
で定義された8桁目までは0で埋められます。
逆にMAX値を入れた場合は、4294967295
の値になります。
`column_int_2` int(8) unsigned zerofill DEFAULT NULL
tinyint(1)とはなにか?
「tinyint(1)ってなんだよ!!最大値127で(1)って桁数じゃないじゃん!!!」
ということがありますが、これの(1)というのは別です。
どうやら、MYSQLにはBOOLEAN型が存在せず、tinyint型に内包されています。
そのBOOLEAN型を示すのがtinyint(1)
らしいのです。
ややこしい(;^ω^)。
ちなみにvarcharなどの文字列は…
これは桁数を示しています。
ごっちゃになりがちなので、MySQLに関しては型の最大値は調べてやった方がいいかもしれません。