知っておけばよかった! MySQL BigInt(20) と Int(20) の落とし穴
MySQL の型: BigInt(20) と Int(20) の違い
MySQL で数値データを格納する際、INT
と BIGINT
という2つの主要なデータ型があります。どちらを選ぶべきか迷うこともあるでしょう。
まず、INT(20)
と BIGINT(20)
の括弧内の数字は、表示幅 を指定するものであり、格納できる値の範囲 を制限するものではありません。
データ型 | 許容値範囲 | 必要なストレージ |
---|---|---|
INT | -2,147,483,648 ~ 2,147,483,647 | 4バイト |
BIGINT | -9,223,372,036,854,775,808 ~ 9,223,372,036,854,775,807 | 8バイト |
詳細
- INT 型は、4バイトのストレージを使用し、-2,147,483,648 から 2,147,483,647 までの範囲の値を格納できます。多くの場合、この範囲で十分なため、デフォルトで
INT
型が使用されます。 - BIGINT 型は、8バイトのストレージを使用し、-9,223,372,036,854,775,808 から 9,223,372,036,854,775,807 までの非常に大きな範囲の値を格納できます。
- 格納する値の範囲が
INT
型の許容範囲内に収まる場合は、INT
型を選択するべきです。これは、4バイトの方が8バイトよりもストレージ効率が良いためです。 - 格納する値の範囲が
INT
型の許容範囲を超える場合は、BIGINT
型を選択する必要があります。
補足
INT(20)
とBIGINT(20)
のように、括弧内に数字を指定すると、その数字が 表示幅 になります。これは、データがどのように表示されるかを制御します。- 例えば、
INT(20)
型の値が12345
であっても、表示幅が20に設定されているため、00000000000000012345
のように表示されます。 - 表示幅は、データの格納や比較には影響しません。
-- テーブル作成
CREATE TABLE test (
id INT,
big_id BIGINT
);
-- データ挿入
INSERT INTO test (id, big_id) VALUES (12345, 1234567890123456789);
-- データ確認
SELECT * FROM test;
-- 結果
+------+-------------------+
| id | big_id |
+------+-------------------+
| 12345 | 1234567890123456789 |
-- INT 型の最大値を超える値を挿入
INSERT INTO test (id, big_id) VALUES (9999999999, 9999999999999999999);
-- 結果
ERROR 1264 (22003): Out of range value for column 'id' at row 1
-- BIGINT 型の最大値を超える値を挿入
INSERT INTO test (id, big_id) VALUES (12345, 9223372036854775807);
-- 結果
ERROR 1264 (22003): Out of range value for column 'big_id' at row 1
上記のコードの説明
test
というテーブルを作成します。このテーブルには、id
というINT
型の列とbig_id
というBIGINT
型の列があります。id
列に 12345、big_id
列に 1234567890123456789 という値を挿入します。SELECT * FROM test
コマンドを実行して、テーブルの内容を確認します。id
列に 9999999999 という値を挿入しようとしますが、これはINT
型の最大値を超えているため、エラーが発生します。
このサンプルコードからわかること
INT
型は、-2,147,483,648 から 2,147,483,647 までの範囲の値を格納できます。
その他の比較方法
- ストレージ容量
- パフォーマンス
INT
型は BIGINT
型よりも処理速度が速くなります。パフォーマンスが重要な場合は、INT
型を選択することを検討する必要があります。
- 将来性
将来、より大きな値を格納する必要が生じる可能性がある場合は、BIGINT
型を選択することを検討する必要があります。
INT
型と BIGINT
型のどちらを選択するかは、格納する値の範囲、ストレージ容量、パフォーマンス、将来性などを考慮して決定する必要があります。
mysql types