MySQL
 Computer >> コンピューター >  >> プログラミング >> MySQL

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)の小さな整数を扱いたい場合に適している。状態を表す数値やスコアなどにも利用可能。

どちらもストレージを節約できる便利なデータ型ですが、格納できる値の範囲が大きく異なるため、用途に応じて適切に使い分けることが重要です。

  1. 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)次に、作成したテーブルの構造

  2. MySQLにおける「!=NULL」と「IS NOT NULL」の違いとは?

    MySQLでは、値を!=NULLと比較すると、結果は必ずNULLになります。つまり、!=NULLという比較は意味を持ちません。NULLは「不明な値」を表すため、通常の比較演算子では判定できないのです。NULL値を判定するには、専用の演算子であるIS NOT NULLを使用します。ここでは、!=NULLとIS NOT NULLの違いを実際に確認するために、まずテーブルを作成します。テーブルの作成まず、次のコマンドでテーブルを作成します。mysql> create table DemoTable1970     (