【MySQL】MySQLでのBooleanの扱い
Mysqlのboolean型について調べてみた - Qiita の内容を自分の手で確かめてみた
環境
> docker-compose exec mysql mysql --version mysql Ver 8.0.16 for Linux on x86_64 (MySQL Community Server - GPL)
まとめ
boolean
とtinyint(1)
のどちらともtinyint(1)
で CREATE TABLE されるtrue
は1
、false
は0
で INSERT される- 値の比較は
=
とis
で変わるwhere col = true
は1
のデータ、where col = false
は0
のデータ(想定通り)where col is true
は0
以外のデータ、where col is false
は0
のデータ(想定と違う)
CREATE
booleanとtinyint(1)のテーブルを作成し、全く同じデータを入れてみた
> create table test_boolean (bool_col boolean); > create table test_tinyint (bool_col tinyint(1));
boolean
とtinyint(1)
のどちらともtinyint(1)
でカラムが作成される
> show create table test_boolean; +--------------+--------------------------------------+ | Table | Create Table | +--------------+--------------------------------------+ | test_boolean | CREATE TABLE `test_boolean` ( | | | `bool_col` tinyint(1) DEFAULT NULL | | | ) ENGINE=InnoDB DEFAULT CHARSET=utf8 | +--------------+--------------------------------------+ > show create table test_tinyint; +--------------+--------------------------------------+ | Table | Create Table | +--------------+--------------------------------------+ | test_tinyint | CREATE TABLE `test_tinyint` ( | | | `bool_col` tinyint(1) DEFAULT NULL | | | ) ENGINE=InnoDB DEFAULT CHARSET=utf8 | +--------------+--------------------------------------+
INSERT
false
をINSERTすると0
> insert into test_boolean values (false); > select * from test_boolean; +----------+ | bool_col | +----------+ | 0 | +----------+
true
をINSERTすると1
> truncate test_boolean; > insert into test_boolean values (true); > select * from test_boolean; +----------+ | bool_col | +----------+ | 1 | +----------+
WHERE
where col = true
は1
のデータ、where col = false
は0
のデータが抽出できるwhere col is true
は0
以外のデータ、where col is false
は0
のデータが抽出できる- これ知ってないとハマりそう。でも、基本、
is
じゃなくて、=
で比較すればいいのかも?
- これ知ってないとハマりそう。でも、基本、
以下のようなデータを用意
> insert into test_tinyint values (false), (true), (1), (0), (100), (-100); > select * from test_tinyint; +----------+ | bool_col | +----------+ | 0 | | 1 | | 1 | | 0 | | 100 | | -100 | +----------+
=
を使った抽出
> select * from test_tinyint where bool_col = true; +----------+ | bool_col | +----------+ | 1 | | 1 | +----------+ > select * from test_tinyint where bool_col = false; +----------+ | bool_col | +----------+ | 0 | | 0 | +----------+
is
を使った抽出
> select * from test_tinyint where bool_col is true; +----------+ | bool_col | +----------+ | 1 | | 1 | | 100 | | -100 | +----------+ > select * from test_tinyint where bool_col is false; +----------+ | bool_col | +----------+ | 0 | | 0 | +----------+