MySQLの整数値型 詳解
研修医をしているgorogoroumaruと申します。
普段は病院で働いていますが、最近ソフトウェアエンジニアへの転職活動を始めました。その一環でzennに初投稿します。
転職活動に苦戦しているためオファー等あればぜひご連絡ください。
この記事の対象者
- MySQLのデータ型を知ってdisk効率の良いスキーマ設計をしたい方
- MySQLで各データ型がどのようにdisk上に格納されているか興味のある方
MySQLの整数値型
MySQLでは、整数を扱うデータ型として、tinyint、smallint, mediumint、int, bigintが使えます。それぞれのデータサイズ、値の最大値・最小値は以下の通りです。
signedの場合
データ型 | サイズ | 値の範囲 |
---|---|---|
TINYINT | 1byte | -128から127 |
SMALLINT | 2byte | -32768から327670 |
MEDIUMINT | 3byte | -8388608から8388607 |
INT | 4byte | -2147483648から2147483647 |
BIGINT | 8byte | -9223372036854775808から9223372036854775807 |
unsignedの場合
データ型 | サイズ | 値の範囲 |
---|---|---|
TINYINT | 1byte | 0から255 |
SMALLINT | 2byte | 0から65,535 |
MEDIUMINT | 3byte | 0から16777215 |
INT | 4byte | 0から4294967295 |
BIGINT | 8byte | 0から18446744073709551615 |
型の選択基準
基本的にはカラムの取りうる値の範囲を検討してそれを含む最小のデータサイズの型を選択します。
例えば本のデータベースを作成しているとします。本のページ数のカラム定義を検討しましょう。
ページ数がマイナスの値になることはないのでunsignedを指定します。
ページ数は高々65000ページであると想定すればわざわざ4.2億まで表現できるINTを使う必要はなく、SMALLINTで十分です。
整数型につける括弧()に関してよくある間違い
例えば、INT(20)という表記がINT型の取りうる値の範囲を指定していると考えるのは誤解です。括弧内の数字は単に表示の幅を指定するためのものであり、データ型の取りうる数値の桁数を制御するものではありません。
カラム定義にzerofillを指定すると()内の数字の幅分だけ0でパディングされます。
実際に例を見てみましょう
()内の数値を指定しない場合
create table books (
id bigint NOT null auto_increment,
title varchar(100) not null,
num_pages int zerofill,
primary key(id)
);
insert into books (title, num_pages) values ("hoge", 100);
select * from books;
結果
()内の値を指定した場合
create table books (
id bigint NOT null auto_increment,
title varchar(100) not null,
num_pages int(20) zerofill,
primary key(id)
);
insert into books (title, num_pages) values ("hoge", 100);
select * from books;
結果
デフォルトでは10桁分が0でパディングされますが、今回はint(20)としたため20桁分がパディングされています。
参考サイト
この記事はMySQL for developersというplanetscale様が公開している動画講座を参考に作成しています。
関連リンク
MySQLの小数値型 詳解
MySQLの文字列型 CHAR,VARCHAR 詳解
MySQLのバイナリデータ型 BINARY, VARBINARY 詳解
MySQLのTEXT、BLOB 詳解
MySQLのENUM型 詳解
MySQLの時間データ型 詳解
MySQLのJSON型 詳解
MySQL - innodbにおける各データ型のサイズまとめ
Discussion