LoginSignup
0
0

More than 1 year has passed since last update.

MySQLの数値型は最大値が決まっている、(数値)は最大桁数ではない

Last updated at Posted at 2022-11-26

よくやらかすので備忘録として残しておきます。

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文字入っています。
image.png

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に関しては型の最大値は調べてやった方がいいかもしれません。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0