MySQLのINT(1)とTINYINT(1)の違いは何?表示幅とデータ型の範囲を徹底解説
はじめに:括弧内の「1」は表示幅を意味する
MySQLでは、INT(1) や TINYINT(1) のように型名の後に括弧で数字を指定できますが、この数字は表示幅(display width)を示すものであり、保存できる値の範囲やストレージ容量には一切影響しません。
つまり、INT(1) でも通常の INT と同じく4バイトが使用され、大きな値を格納できます。これは多くの開発者が誤解しがちなポイントです。
INTとTINYINTの基本的な違い
両者の実際の違いは、必要なバイト数と表現できる値の範囲にあります。
- TINYINT: 1バイトを使用。範囲は -128 ~ +127
- INT: 4バイトを使用。範囲は -2147483648 ~ +2147483647
それでは、表示幅の挙動を理解するために、実際にテーブルを作成して確認してみましょう。
テーブルの作成
ZEROFILL オプションを付けた INT(1) と TINYINT(1) のカラムを持つテーブルを作成します。
mysql> create table intAndTinyint
−> (
−> FirstNumber int(1) zerofill,
−> SecondNumber tinyint(1) zerofill
−> );
Query OK, 0 rows affected (0.52 sec)
レコードの挿入
次に、INSERT文でレコードを挿入します。
mysql> insert into intAndTinyint values(1,1);
Query OK, 1 row affected (0.32 sec)
mysql> insert into intAndTinyint values(12,12);
Query OK, 1 row affected (0.26 sec)
mysql> insert into intAndTinyint values(123,123);
Query OK, 1 row affected (0.14 sec)
SELECT文で全レコードを確認
mysql> select *from intAndTinyint;
実行結果は以下の通りです。
+-------------+--------------+
| FirstNumber | SecondNumber |
+-------------+--------------+
| 1 | 1 |
| 12 | 12 |
| 123 | 123 |
+-------------+--------------+
3 rows in set (0.00 sec)
ご覧のように、括弧内の幅が「1」であっても、桁数を超える値はそのまま格納・表示されます。表示幅は最小限のパディング幅を指定するだけで、上限にはなりません。
ZEROFILLで表示幅の違いを確認する
表示幅の概念は、括弧内の数値を大きく設定したときに ZEROFILL と組み合わせるとより明確に理解できます。ここでは INT のみを使って検証してみましょう。
異なる表示幅を持つテーブルを作成
mysql> create table intVsIntAnyThingDemo
−> (
−> Number1 int(11) unsigned zerofill,
−> Number int(13) unsigned zerofill
−> );
Query OK, 0 rows affected (1.17 sec)
レコードの挿入
それぞれ異なる桁数の値を挿入します。
mysql> insert into intVsIntAnyThingDemo values(12345,6789);
Query OK, 1 row affected (0.44 sec)
mysql> insert into intVsIntAnyThingDemo values(3,2);
Query OK, 1 row affected (0.20 sec)
mysql> insert into intVsIntAnyThingDemo values(12,89);
Query OK, 1 row affected (0.15 sec)
mysql> insert into intVsIntAnyThingDemo values(123,6789);
Query OK, 1 row affected (0.17 sec)
mysql> insert into intVsIntAnyThingDemo values(1234,6789);
Query OK, 1 row affected (0.14 sec)
結果の確認
mysql> select *from intVsIntAnyThingDemo;
実行結果を見ると、指定した表示幅に応じて先頭がゼロで埋められていることがわかります。
+-------------+---------------+
| Number1 | Number |
+-------------+---------------+
| 00000012345 | 0000000006789 |
| 00000000003 | 0000000000002 |
| 00000000012 | 0000000000089 |
| 00000000123 | 0000000006789 |
| 00000001234 | 0000000006789 |
+-------------+---------------+
5 rows in set (0.00 sec)
Number1:表示幅11 → 値が11桁に満たない場合、先頭がゼロで埋められるNumber:表示幅13 → 値が13桁に満たない場合、先頭がゼロで埋められる
一方、指定幅を超える桁数の値(例:12345 は5桁ですが、より長い値の場合)も制限なく格納されます。
まとめと注意点
- 括弧内の数字は表示幅の指定であり、格納できる値の範囲には影響しない
TINYINTは1バイト(-128~127)、INTは4バイト(約±21億)と、必要な容量と範囲が大きく異なるZEROFILLを使うと、指定した表示幅に満たない桁が先頭ゼロで埋められて表示される
なお、MySQL 8.0.17以降では整数型の表示幅指定は非推奨(deprecated)となっているため、新規プロジェクトでは表示幅を指定せず、単に INT や TINYINT を使用するのが推奨されます。フラグ的な用途で0/1だけを扱う場合は、TINYINT(1) が慣習的にBOOLEANとして使われることもありますが、これも範囲制限ではなく慣例である点に留意しましょう。
-
MySQLのTINYINT型カラムに対してUPDATEステートメントを使用する方法
MySQLでは、TINYINT型のカラムは真偽値(true/false)を扱う際によく利用されます。この記事では、TINYINT型のカラムを持つテーブルに対して、UPDATEステートメントで値を更新する手順を具体的に解説します。1. テーブルを作成するまず、サンプル用のテーブルを作成します。ここでは、isMarried カラムを TINYINT 型として定義しています。mysql> create table DemoTable -> ( -> EmployeeId int, -> isMarried tinyint -> );Query O
-
MySQLクエリでLIKE句を2回使う方法|OR条件で複数パターンを検索する
MySQLでは、LIKE句を1つのクエリ内で2回以上使用することで、複数のパターンに一致するレコードを柔軟に抽出できます。この記事では、実際にテーブルを作成し、LIKE句を2回組み合わせた検索クエリの書き方を手順を追って解説します。 1. サンプルテーブルを作成する まず、検索対象となるテーブルを作成します。 mysql> create table DemoTable2009 ( Name varchar(20) ); Query OK, 0 rows affected (0.51 sec) 2. テーブルにレコードを挿入する INSERT文を使って、いくつかの名前データを登録し