Подтвердить что ты не робот

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? Какой из них независим от поставщика?

4b9b3361

Ответ 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

Я уверен, что мы все это делали много раз.