MySQLのBIT型とTINYINT型の違いを徹底解説!保存できる値の範囲と使い分け
MySQLにはさまざまな数値データ型が用意されていますが、その中でも「BIT」と「TINYINT」は、小さな値を格納するための型としてよく比較されます。この記事では、両者の違いとそれぞれの特徴を、実際のSQL実行例を交えながらわかりやすく解説します。
BIT型とTINYINT型の基本的な違い
BIT型:1ビット(0または1)のみ格納可能
BIT型は、1ビットの値を格納するためのデータ型です。保存できるのは 0 か 1 のみ です。たとえば「2」のような値は格納できず、BIT型のカラムに挿入しようとするとMySQLはエラーを返します。
TINYINT型:8ビット(最大127まで)格納可能
TINYINT型は、8ビット(1バイト)の整数を格納できるデータ型です。符号付きの場合、最大値は127です。そのため「987」のような大きな値は格納できず、範囲を超える値を挿入しようとするとエラーが発生します。
それでは、実際にMySQL 8.0.12で動作を確認してみましょう。
まず、システムにインストールされているバージョンを確認します。
mysql> select version();
実行結果は以下の通りです。
+-----------+ | version() | +-----------+ | 8.0.12 | +-----------+ 1 row in set (0.00 sec)
BIT型の動作検証
まず、BIT型のカラムを持つテーブルを作成します。
mysql> create table BitDemo -> ( -> Id BIT -> ); Query OK, 0 rows affected (0.56 sec)
次に、「BitDemo」テーブルにレコードを挿入してみます。
mysql> insert into BitDemo values(1); Query OK, 1 row affected (0.13 sec) mysql> insert into BitDemo values(0); Query OK, 1 row affected (0.33 sec)
0と1は問題なく挿入できますが、2を挿入しようとするとエラーになります。
mysql> insert into BitDemo values(2); ERROR 1406 (22001): Data too long for column 'Id' at row 1
このように、BIT型では1ビットで表現できない値は「Data too long」エラーとして拒否されます。
TINYINT型の動作検証
続いて、TINYINT型のカラムを持つテーブルを作成します。
mysql> create table TinyIntDemo -> ( -> Id TINYINT -> ); Query OK, 0 rows affected (0.69 sec)
レコードを挿入してみます。
mysql> insert into TinyIntDemo values(123); Query OK, 1 row affected (0.17 sec) mysql> insert into TinyIntDemo values(97); Query OK, 1 row affected (0.15 sec) mysql> insert into TinyIntDemo values(127); Query OK, 1 row affected (0.16 sec)
-128〜127の範囲内であれば正常に挿入できます。しかし、127を超える値を挿入しようとするとエラーが発生します。
mysql> insert into TinyIntDemo values(9876); ERROR 1264 (22003): Out of range value for column 'Id' at row 1 mysql> insert into TinyIntDemo values(987); ERROR 1264 (22003): Out of range value for column 'Id' at row 1 mysql> insert into TinyIntDemo values(255); ERROR 1264 (22003): Out of range value for column 'Id' at row 1 mysql> insert into TinyIntDemo values(254); ERROR 1264 (22003): Out of range value for column 'Id' at row 1 mysql> insert into TinyIntDemo values(200); ERROR 1264 (22003): Out of range value for column 'Id' at row 1 mysql> insert into TinyIntDemo values(199); ERROR 1264 (22003): Out of range value for column 'Id' at row 1
このように、TINYINT型(符号付き)で格納できる最大値は127です。なお、TINYINTに UNSIGNED 属性を付けると、0〜255の範囲で格納できるようになります。
最後に、SELECTコマンドを使って、正しく挿入されたレコードをすべて表示してみましょう。
mysql> select * from TinyIntDemo;
実行結果は以下の通りです。
+------+ | Id | +------+ | 123 | | 97 | | 127 | +------+ 3 rows in set (0.00 sec)
まとめ:BIT型とTINYINT型の使い分け
- BIT型:0か1のフラグ的な値(ON/OFF、真偽値など)を格納したい場合に最適。最小1ビットで省スペース。
- TINYINT型:-128〜127(UNSIGNEDなら0〜255)の小さな整数を扱いたい場合に適している。状態を表す数値やスコアなどにも利用可能。
どちらもストレージを節約できる便利なデータ型ですが、格納できる値の範囲が大きく異なるため、用途に応じて適切に使い分けることが重要です。
-
MySQLのTINYINT(1)とブール型(BOOLEAN)の違いとは?
結論から言うと、TINYINT(1)とブール型(BOOLEAN)の間に違いはありません。MySQLでは、BOOLまたはBOOLEANというキーワードは内部的にTINYINT(1)へと変換されます。つまり、BOOLやBOOLEANはTINYINT(1)の別名(シノニム)として扱われるのです。それでは、実際にテーブルを作成して確認してみましょう。BOOLEAN型でテーブルを作成するmysql> create table DemoTable ( isMarried Boolean ); Query OK, 0 rows affected (1.77 sec)次に、作成したテーブルの構造
-
MySQLにおける「!=NULL」と「IS NOT NULL」の違いとは?
MySQLでは、値を!=NULLと比較すると、結果は必ずNULLになります。つまり、!=NULLという比較は意味を持ちません。NULLは「不明な値」を表すため、通常の比較演算子では判定できないのです。NULL値を判定するには、専用の演算子であるIS NOT NULLを使用します。ここでは、!=NULLとIS NOT NULLの違いを実際に確認するために、まずテーブルを作成します。テーブルの作成まず、次のコマンドでテーブルを作成します。mysql> create table DemoTable1970 (