MySQL: "= true" vs "is true" на BOOLEAN. Когда целесообразно использовать какой? И какой из них независим от поставщика?
MySQL предоставляет два способа проверить значение истинности столбцов boolean
, это column_variable = true
и column_variable is true
. Я создал таблицу, ввел несколько значений и попробовал несколько операторов select
. Вот результаты:
Сначала я создал эту таблицу:
mysql> create table bool_test (
-> id int unsigned not null auto_increment primary key,
-> flag boolean );
Query OK, 0 rows affected (0.13 sec)
Затем я вставил 4 строки:
mysql> insert into bool_test(flag) values (true),(false),(9),(null);
mysql> select * from bool_test;
+----+------+
| id | flag |
+----+------+
| 1 | 1 |
| 2 | 0 |
| 3 | 9 |
| 4 | NULL |
Вот все запросы select
, которые я запускал в этой таблице:
mysql> select * from bool_test where flag;
+----+------+
| id | flag |
+----+------+
| 1 | 1 |
| 3 | 9 |
+----+------+
2 rows in set (0.49 sec)
mysql> select * from bool_test where flag = true;
+----+------+
| id | flag |
+----+------+
| 1 | 1 |
+----+------+
1 row in set (0.02 sec)
mysql> select * from bool_test where flag is true;
+----+------+
| id | flag |
+----+------+
| 1 | 1 |
| 3 | 9 |
+----+------+
2 rows in set (0.04 sec)
mysql> select * from bool_test where flag = false;
+----+------+
| id | flag |
+----+------+
| 2 | 0 |
+----+------+
1 row in set (0.01 sec)
mysql> select * from bool_test where flag is false;
+----+------+
| id | flag |
+----+------+
| 2 | 0 |
+----+------+
1 row in set (0.00 sec)
mysql> select * from bool_test where !flag;
+----+------+
| id | flag |
+----+------+
| 2 | 0 |
+----+------+
1 row in set (0.00 sec)
mysql> select * from bool_test where not flag;
+----+------+
| id | flag |
+----+------+
| 2 | 0 |
+----+------+
1 row in set (0.00 sec)
mysql> select * from bool_test where flag != true;
+----+------+
| id | flag |
+----+------+
| 2 | 0 |
| 3 | 9 |
+----+------+
2 rows in set (0.00 sec)
mysql> select * from bool_test where flag is not true;
+----+------+
| id | flag |
+----+------+
| 2 | 0 |
| 4 | NULL |
+----+------+
2 rows in set (0.00 sec)
mysql> select * from bool_test where flag != false;
+----+------+
| id | flag |
+----+------+
| 1 | 1 |
| 3 | 9 |
+----+------+
2 rows in set (0.04 sec)
mysql> select * from bool_test where flag is not false;
+----+------+
| id | flag |
+----+------+
| 1 | 1 |
| 3 | 9 |
| 4 | NULL |
+----+------+
3 rows in set (0.00 sec)
Мой вопрос: когда целесообразно использовать is
/is not
и когда целесообразно использовать =
/!=
с помощью true
/false
? Какой из них независим от поставщика?
Ответы
Ответ 1
MySQL фактически обманывает вас. Он вообще не имеет типа булевого столбца:
BOOL
, BOOLEAN
Эти типы являются синонимами для TINYINT(1)
. Рассчитывается значение нуля ложный. Ненулевые значения считаются истинными:
Кроме того, логические литералы не такие:
Константы TRUE
и FALSE
оценивают соответственно 1 и 0.
Учитывая, что:
- Многие системы баз данных не имеют логических значений (не, по крайней мере, в стандартных типах SQL и столбцах)
- У MySQL нет простого способа принудительного применения
0
или 1
в BOOLEAN
Мое заключение:
- Вам нужно будет использовать
WHERE IS flag
или просто WHERE flag
, потому что =
просто не работает правильно. Какой из них, возможно, является вопросом предпочтения.
- Независимо от того, что вы выберете, ни один вариант не будет независимым от поставщика. Например, Oracle даже не запускает ни один из них.
Изменить:, если кросс-платформа обязательна, я бы пошел на это:
WHERE flag=0
WHERE flag<>0
Я уверен, что мы все это делали много раз.