MySQL の数値型を使い分ける

MySQL の数値型は見た目以上に種類が多く、それぞれ格納できる範囲とストレージサイズが異なります。正しく使い分けることで、無駄なディスク消費を抑えつつ、アプリケーションの要件を満たせます。

整数型の一覧

整数型は5種類あり、それぞれ符号付き(SIGNED)と符号なし(UNSIGNED)を選べます。

バイト数符号付き範囲
TINYINT1-128 〜 127
SMALLINT2-32,768 〜 32,767
MEDIUMINT3約 -838万 〜 838万
INT4約 -21億 〜 21億
BIGINT8約 -922京 〜 922京

UNSIGNED を付けると負の範囲がなくなる代わりに、正の範囲が2倍に広がります。たとえば TINYINT UNSIGNED は 0〜255 の範囲を扱えます。

使い分けの目安

どの整数型を選ぶかは、そのカラムに入りうる値の最大値で決めるのが基本です。

TINYINT の適用例

ステータスコード、フラグ値、年齢など。0〜127 や 0〜255 で収まるデータに最適です。

SMALLINT の適用例

ポート番号、年度、中規模のカテゴリ ID など。数万件規模のマスターテーブルの主キーにも使えます。

INT の適用例

一般的なテーブルの主キーや外部キー。多くのケースではこれで十分であり、最もよく使われる整数型です。

BIGINT の適用例

大規模サービスのユーザー ID、ログテーブルの主キー、Twitter のツイート ID のように数十億を超える可能性がある場合に使います。

小数型の選択

小数を扱う場合は DECIMAL、FLOAT、DOUBLE の3つから選びます。最も重要なのは、金額計算には必ず DECIMAL を使うという点です。

DECIMAL(固定小数点)

正確な値を保持できるため、金額や税率の計算に適しています。DECIMAL(10,2) なら小数点以下2桁、整数部8桁まで格納できます。

FLOAT / DOUBLE(浮動小数点)

近似値で格納されるため、科学計算やスコアリングなど多少の誤差が許容される場面で使います。金額には絶対に使ってはいけません。

FLOAT と DOUBLE の違いはストレージサイズと精度で、FLOAT は4バイト(約7桁の精度)、DOUBLE は8バイト(約15桁の精度)となります。

BIT 型

論理値(真偽値)を格納する場合は BIT(1) も選択肢に入りますが、実務では TINYINT(1) や BOOLEAN(内部的には TINYINT(1) のエイリアス)を使うことが多いです。ORM やフレームワークとの互換性を考慮すると、TINYINT(1) のほうが扱いやすい場面が多くなります。

数値型の選択は一見地味ですが、テーブルの行数が増えるほどストレージとパフォーマンスへの影響が大きくなります。「このカラムに入る値の最大値はいくつか」を常に意識して選びましょう。