BIGINT(20) unsignedの桁数について

BIGINT(20) unsignedの桁数について

BIGINT(20) unsignedの桁数について

BIGINT(20) unsignedというMySQLのデータ型が何桁まで表現できるのか調べてみました。このデータをString型の変数に代入するときに何文字になるのか気になったのが発端です。

カッコ内の数値は表示幅

MySQLデータベースを触っていて、ふととあるデータ型について疑問に思ったので、調べてみた。まず、こちらのテーブルのidというキーのデータ型をご覧いただきたい。

db> desc wp_table;
+-------+---------------------+------+-----+---------+----------------+
| Field | Type                | Null | Key | Default | Extra          |
+-------+---------------------+------+-----+---------+----------------+
| id    | bigint(20) unsigned | NO   | PRI | NULL    | auto_increment |
+-------+---------------------+------+-----+---------+----------------+

私の素朴な疑問としては、BIGINT(20) unsignedって結局何ケタになるの?

BIGINTは264(8バイト)通りの数値を表せる。十進数に置き換えると、

  • signed BIGINTであれば-263~263-1、または -9,223,372,036,854,775,808 ~ 9,223,372,036,854,775,807
  • unsigned BIGINTであれば、0~263-1、または 0 ~ 1,844,674,407,370,955,161

の範囲が表現可能ということになるが、ではカッコ内の「20」は一体何なの?

ってことで、調べたところ、公式ドキュメントに以下のような記載がありました!

M は整数型の最大表示幅を示します。最大表示幅は 255 です。セクション11.2「数値型」で説明しているように、表示幅はその型に含めることができる値の範囲とは関係ありません。浮動小数点型と固定小数点型の場合、M は格納可能な桁数の合計です。

https://dev.mysql.com/doc/refman/5.6/ja/numeric-type-overview.html

どうやら、このカッコ内の数値 M(私の例では20)は最大表示幅を示しており(使用可能な値の範囲とは関係ない)、ZEROFILLオプションを利用している際に、ゼロ埋めを何ケタまで行うかのケタ数を指定するものらしい。

例えば、INT(5)のデータ型を持つテーブルに123という3ケタのデータがある場合、00123という感じに5ケタになるようにゼロ埋めしてくれる幅のサイズを示しているとのこと。

また、この定義はZEROFILL機能に対して使用される機能であり、値の上限を示すものではないとのこと。よって、INT(5)に123456のような6ケタの値も格納可能。

ちなみに、こちらのStack Overflowの記事で分かりやすく説明してくれてる方がいらっしゃいました。
https://stackoverflow.com/questions/3135804/types-in-mysql-bigint20-vs-int20#answer-3135854