目次
BOOLEAN型とは?
BOOLEAN型とは、真理値をとるデータ型のことです。MySQLで真理値は、「true/false」「1/0」で表現されます。
BOOLEAN型のテーブルを作成
MySQLの中でBOOLEAN型を指定した場合、どのような扱いになるのかテーブルを作成して確認してみましょう。
CREATE TABLEで「boolean_table」テーブルを作成し、「bool_data」というBOOLEAN型のカラムを用意します。
mysql> CREATE TABLE boolean_table (bool_data BOOLEAN);
BOOLEAN型は内部的には「tinyint(1)」として扱われ、初期値はNULL
作成したテーブルをSHOW CREATE TABLEで確認すると次のように表示されるはずです。
mysql> SHOW CREATE TABLE boolean_table; +---------------+-----------------------------------------------------------------------------------------------------------------------------------------+ | Table | Create Table | +---------------+-----------------------------------------------------------------------------------------------------------------------------------------+ | boolean_table | CREATE TABLE `boolean_table` ( `bool_data` tinyint(1) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci | +---------------+-----------------------------------------------------------------------------------------------------------------------------------------+ 1 row in set (0.00 sec)
BOOLEAN型のデータは「tinyint(1)」というデータ型であり、デフォルト値は「NULL」になっているのがわかります。
よって、MySQLでBOOLEAN型とTINYINT(1)は等価になるのがわかります。
次は、tinyint(1)のテーブルの表示確認です。
mysql> CREATE TABLE tinyint_table (bool_data tinyint(1)); mysql> SHOW CREATE TABLE tinyint_table; +---------------+-----------------------------------------------------------------------------------------------------------------------------------------+ | Table | Create Table | +---------------+-----------------------------------------------------------------------------------------------------------------------------------------+ | tinyint_table | CREATE TABLE `tinyint_table` ( `bool_data` tinyint(1) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci | +---------------+-----------------------------------------------------------------------------------------------------------------------------------------+ 1 row in set (0.00 sec)
さまざまな値をBOOLEAN型データに格納
MySQLのBOOLEAN型は、内部的にはtinyint(1)として扱われています。
そのため、0と1以外の値を入れることも可能です。
ここでは、さまざまな値を格納してどのように扱われるのかを確認してみましょう。
mysql> INSERT INTO boolean_table VALUES (1), (0), (true), (false), (NULL), (100), (-100); Query OK, 7 rows affected (0.01 sec) Records: 7 Duplicates: 0 Warnings: 0
これら7つのデータを確認してみると、次のようになります。
mysql> SELECT * FROM boolean_table; +-----------+ | bool_data | +-----------+ | 1 | | 0 | | 1 | | 0 | | NULL | | 100 | | -100 | +-----------+ 7 rows in set (0.01 sec)
「true」と「false」は「1」と「0」になり、「NULL」「100」「-100」はそのまま格納されているのがわかりますね。
tinyint(1)の範囲を超える値を格納しようとすると、以下のようにERRORが発生します。
mysql> INSERT INTO boolean_table VALUES (127), (128), (255); ERROR 1264 (22003): Out of range value for column 'bool_data' at row 2
BOOLEAN型のデータを「true/false」「IS true/IS false」でSELECT
先ほど格納したデータを「true/false」でSELECTしてみるとどうなるのでしょうか。
実行結果は次のようになるはずです。
mysql> SELECT * FROM boolean_table WHERE bool_data = true; +-----------+ | bool_data | +-----------+ | 1 | | 1 | +-----------+ 2 rows in set (0.00 sec) mysql> SELECT * FROM boolean_table WHERE bool_data = false; +-----------+ | bool_data | +-----------+ | 0 | | 0 | +-----------+ 2 rows in set (0.00 sec)
ちゃんと「0」と「1」のデータが取得できます。
では、「Is true/Is false」でSELECTしてみるとどうなるのでしょうか。
「true/false」と同じではないのか、と思うかもしれませんが実行してみると次のようになるはずです。
mysql> SELECT * FROM boolean_table WHERE bool_data IS true; +-----------+ | bool_data | +-----------+ | 1 | | 1 | | 100 | | -100 | +-----------+ 4 rows in set (0.00 sec) mysql> SELECT * FROM boolean_table WHERE bool_data IS false; +-----------+ | bool_data | +-----------+ | 0 | | 0 | +-----------+ 2 rows in set (0.00 sec)
「Is false」は「false」と同じ結果ですが、「Is true」は「true」と異なり1以外の値もtrueとして返しているのがわかります。
- Is true:0以外
- Is false:0
BOOLEAN型のNULLデータは「IS UNKNOWN」扱い
0と0以外の値は「Is true/Is false」で扱われるのがわかりました。
しかし、「NULLのデータはどのように確認すればよいのだろう」と思う方もいるでしょう。
NULLデータは「IS UNKNOWN」でSELECT可能です。
mysql> SELECT * FROM boolean_table WHERE bool_data IS UNKNOWN; +-----------+ | bool_data | +-----------+ | NULL | +-----------+ 1 row in set (0.00 sec)
bit(1)で0と1だけのBOOLEAN型テーブルを作成
データ型をBOOLEANに設定すると、0と1以外の値も格納できてしまいました。
これだと、0以外の値もtrue扱いになってしまうため、0と1で真理値を扱いたいと思っても管理が難しくなる可能性があります。
0と1だけで真理値を扱いたい場合のひとつの方法として「bit(1)」のデータ型を使用するものがあります。
bit(1)は、0(0x00)と1(0x01)の2値を扱うため、それ以外の値は設定できない特徴があるのです。
試しに、bit(1)をデータ型に設定したテーブルを作成してみましょう。
mysql> CREATE TABLE bit_table (bool_data bit(1)); mysql> INSERT INTO bit_table VALUES (0), (1); mysql> SELECT * FROM bit_table; +----------------------+ | bool_data | +----------------------+ | 0x00 | | 0x01 | +----------------------+ 2 rows in set (0.00 sec)
上記のようにテーブルが作成できます。
ここに2を入れようとしても、エラーが出るため入れられないのがわかります。
mysql> INSERT INTO bit_table VALUES (2); ERROR 1406 (22001): Data too long for column 'bool_data' at row 1
「true」「false」は1と0扱いなのでテーブルに格納可能です。
SELECTで「true」「false」を取り出すこともできます。
mysql> SELECT * FROM bit_table WHERE bool_data = true; +----------------------+ | bool_data | +----------------------+ | 0x01 | +----------------------+ 1 row in set (0.00 sec) mysql> SELECT * FROM bit_table WHERE bool_data = false; +----------------------+ | bool_data | +----------------------+ | 0x00 | +----------------------+ 1 row in set (0.00 sec)
まとめ
MySQLのBOOLEAN型はtinyint(1)で扱われており、0や1以外の値を入れてしまうとtrueでSELECTするときに想定外の動きをしてしまう可能性があります。
そのため、完全に0と1だけで真理値を扱いたい場合は、bit(1)を考慮してみるとよいかもしれません。
ぜひ、MySQLでBOOLEAN型のデータを扱う際は、この記事を参考にしてみてください。
tinyint型とは、1バイトの記憶領域を必要とする-128 から 127の整数を格納するデータ型のことです。