受講料が最大70%OFF 受講料が最大70%OFF

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」になっているのがわかります。

ポテパンダの一言メモ

tinyint型とは、1バイトの記憶領域を必要とする-128 から 127の整数を格納するデータ型のことです。

よって、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/Is false」の扱い
  • 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型のデータを扱う際は、この記事を参考にしてみてください。

 

エンジニアになりたい人に選ばれるプログラミングスクール「ポテパンキャンプ 」

ポテパンキャンプは卒業生の多くがWebエンジニアとして活躍している実践型プログラミングスクールです。 1000名以上が受講しており、その多くが上場企業、ベンチャー企業のWebエンジニアとして活躍しています。

基礎的な学習だけで満足せず、実際にプログラミングを覚えて実践で使えるレベルまで学習したいという方に人気です。 プログラミングを学習し実践で使うには様々な要素が必要です。

それがマルっと詰まっているポテパンキャンプでプログラミングを学習してみませんか?

卒業生の多くがWebエンジニアとして活躍

卒業生の多くがWeb企業で活躍しております。
実践的なカリキュラムをこなしているからこそ現場でも戦力となっております。
活躍する卒業生のインタビューもございますので是非御覧ください。

経験豊富なエンジニア陣が直接指導

実践的なカリキュラムと経験豊富なエンジニアが直接指導にあたります。
有名企業のエンジニアも多数在籍し品質高いWebアプリケーションを作れるようサポートします。

満足度高くコスパの高いプログラミングスクール「ポテパンキャンプ」

運営する株式会社ポテパンは10,000人以上のエンジニアのキャリアサポートを行ってきております。
そのノウハウを活かして実践的なカリキュラムを随時アップデートしております。

代表の宮崎もプログラミングを覚えサイトを作りポテパンを創業しました。
本気でプログラミングを身につけたいという方にコスパ良く受講していただきたいと思っておりますので、気になる方はぜひスクール詳細をのぞいてくださいませ。