MySQLでテーブルを作成する場合など、int(11)のように()内に様々な数値が設定されているのを見かけます。
この()内の数値をサイズ指定と勘違いしている方も多いようですが、実際にはZEROFILLオプションを指定した際の表示幅指定となります。
本記事では、MySQLでの整数型(int)の取り扱いについて、多くの方が勘違いしているサイズ指定とゼロ埋め表示幅指定の違いを解説していきたいと思います。
目次
MySQLでデータサイズが決まるのはint, tinyintなどのデータ型
まず結論として、MySQLで整数型のデータサイズが決まるのは「データ型」に何を指定したかで決まります。
MySQLの整数型には5種類のデータ型が存在する
MySQLには整数型として下記の5種類が提供されています。
- tinyint
符号あり:-128 ~ 127
符号なし:0 ~ 255 - smallint
符号あり:-32768 ~ 32767
符号なし:0 ~ 65535 - midiumint
符号あり:-8388608 ~ 8388607
符号なし:0 ~ 16777215 - int
符号あり:-2147483648 ~ 2147483647
符号なし:0 ~ 4294967295 - bigint
符号あり:-9223372036854775808 ~ 9223372036854775807
符号なし:0 ~ 18446744073709551615
整数型で指定出来るオプション項目とは?!
上述した5つの整数型には「UNSIGNED」と「ZEROFILL」というオプション項目が設けられています。
UNSIGNED
まず「UNSIGNED」に関してですが、上記の整数型で紹介した「符号あり」「符号なし」のどちらを選択するか決定することが可能となります。
UNSIGNEDを設定した場合、マイナスの値の格納は出来なくなり0以上の整数値データのみが取り扱い可能となります。
実際の指定方法は下記の通りとなります。
CREATE TABLE sample(id INT UNSIGNED);
UNSIGNEDを指定せずに下記のようにCREATE文を発行した場合には、デフォルトでマイナスの値が格納出来るように設定されます。
CREATE TABLE sample(id INT);
ZEROFILL
次に「ZEROFILL」オプションですが、本記事のテーマでもある「int(数値)」の設定数値が影響するオプション項目です。
ZEROFILLを設定した場合、カッコ内で指定した数値の桁数になるようにゼロ埋め処理が実施されます。
実際の指定方法は下記の通りとなります。
CREATE TABLE sample(id INT(11) ZEROFILL);
ZEROFILLを指定した場合、自動的に「UNSIGNED」が設定された状態になることも合わせて覚えておきましょう。
MySQLでint(11)と指定されるカッコ内の数値について確認してみよう!
MySQLでの整数型の基本情報を理解して頂いたところで、整数型のカラムを作成する際に記述される「int(数値)」の意味についてサンプルSQLを交えながらご紹介していきたいと思います。
ZEROFILLの指定有り無しでテーブルを作成してみよう
まず整数型intのカラムを「ZEROFILL」オプションを付けたカラム・付けていないカラムの2つでテーブルを作成してみたいと思います。
CREATE TABLE sample(column1 int, column2 int ZEROFILL);
実際に値を設定してみます。
INSERT INTO sample VALUES(12345, 12345);
テーブルの中身を確認してみると下記のようになっています。
+---------+------------+ | column1 | column2 | +---------+------------+ | 12345 | 0000012345 | +---------+------------+
ZEROFILLを指定したcoloum2のデータがゼロ埋めされているのがご確認頂けます。
10桁になるようにゼロ埋めされているのはintの最大値「4294967295」が10桁であることに起因します。
int()に数値を指定してテーブルを作成してみよう
次にテーブル作成時、ZEROFILLオプションを付けると同時にint()のカッコ内に数値を設定してみましょう。
本記事作成時は「drop table」コマンドで一度「sample」テーブルを削除してから都度SQLを実行しています。
記事の順に沿ってご自身の環境でSQLを実行している場合、テーブル名を変更するか上記で作成したテーブルを削除しておきましょう。
サンプルSQLは下記の通りとなります。
CREATE TABLE sample(column1 int(3) ZEROFILL, column2 int(8) ZEROFILL);
次に値を設定してみます。
INSERT INTO sample VALUES(12, 12);
+---------+----------+ | column1 | column2 | +---------+----------+ | 012 | 00000012 | +---------+----------+
それぞれのカラムでテーブル作成時に指定したカッコ内の桁数になるようゼロ埋めされていることがご確認頂けます。
int()に指定した数値を超える桁数の値がINSERTされたらどうなるの?
ここで疑問に思う方もいらっしゃるかもしれませんが、テーブル作成時に指定した表示桁よりも大きい値がINSERTされた場合にはどのような挙動になるのでしょうか?
上記で作成した「sample」テーブルに下記のINSERT文でデータを格納したいと思います。
INSERT INTO sample VALUES(12345, 12345);
実行した結果は下記のようにデータが格納されています。
+---------+----------+ | column1 | column2 | +---------+----------+ | 12345 | 00012345 | +---------+----------+
最初にお伝えしたように、MySQLでデータサイズが決まるのはあくまで「smallint」「bigint」といったデータ型によるもので、カッコ内の文字列はゼロ埋めするための表示桁数でしかありません。
つまり指定した桁数よりも大きい表示桁となる数値がINSERTされた場合には、指定した桁数とは関係なくINSERT文で指定したデータが格納されることになります。
データ型で定義された最大値や最小値の範囲外の値をINSERTしようとするとエラーとなりますので注意しておきましょう。
さいごに:MySQLにおけるint()の意味を理解してテーブル設計に役立てよう!
本記事では、MySQLにおけるint()のカッコ内に設定された値の意味を初心者でも分かるようにサンプルSQLを交えながらご紹介してきました。
文字列型である「varchar()」の場合、カッコ内に指定された数値が登録可能な桁数となるため、intをはじめとした整数型に関しても同じように勘違いしている方も多くいらっしゃいます。
今回の記事の内容を参考に、しっかりと挙動の違いを把握した上でテーブル設計などに役立ててみてください。
ゼロ埋め処理とは、指定された桁数に値を揃えるために、本来定義したい数値の左側に不足している桁数分「0」を付加する処理を指します。