MySQLの整数値型 詳解

2023/08/24に公開

研修医をしている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様が公開している動画講座を参考に作成しています。
https://planetscale.com/learn/courses/mysql-for-developers/introduction/course-introduction

関連リンク

MySQLの小数値型 詳解
MySQLの文字列型 CHAR,VARCHAR 詳解
MySQLのバイナリデータ型 BINARY, VARBINARY 詳解
MySQLのTEXT、BLOB 詳解
MySQLのENUM型 詳解
MySQLの時間データ型 詳解
MySQLのJSON型 詳解
MySQL - innodbにおける各データ型のサイズまとめ

Discussion