MySQL:BOOLEAN上的"= true"vs"is true".什么时候建议使用哪一个?哪一个与供应商无关?

Abh*_*Oza 38 mysql sql

MySQL提供了2种方法来检查boolean列的真值,这些是column_variable = truecolumn_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)
Run Code Online (Sandbox Code Playgroud)

然后我插入了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 |
Run Code Online (Sandbox Code Playgroud)

以下是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)
Run Code Online (Sandbox Code Playgroud)

我的问题是:什么时候建议使用is/ is not什么时候建议使用=/ != with true/ false?哪一个与供应商无关?

Álv*_*lez 29

MySQL实际上在欺骗你.它根本没有布尔列类型:

BOOL, BOOLEAN

这些类型是同义词TINYINT(1).值为零被视为false.非零值被认为是真的:

此外,布尔文字不是这样的:

常量TRUE并分别FALSE评估为1和0.

考虑到:

  • 许多数据库系统也没有布尔值(至少在标准SQL和列类型中)
  • MySQL没有简单的方法来强制执行01BOOLEAN

我的结论是:

  • 你必须使用WHERE IS flag或只是WHERE flag因为=根本无法正常工作.哪一个,可能是一个偏好问题.
  • 无论您选择什么,任何选项都不会独立于供应商.例如,Oracle甚至不会运行其中任何一个.

编辑:如果跨平台是必须的,我会这样做:

WHERE flag=0
WHERE flag<>0
Run Code Online (Sandbox Code Playgroud)

我相信我们已经做了很多次.

  • `where flag`也能正常工作. (3认同)
  • 我运行测试,`WHERE 1 = 1`工作正常,`WHERE 1`不是.疯.我的世界今天变得悲伤. (3认同)
  • @IulianOnofrei 看一下这个问题:“flag is true”与“9”匹配,但“flag = true”则不匹配。 (2认同)

Lee*_*ree 10

如果flag列被索引并且所有值都是 0 或 1,where flag = true则比where flag is true.

在我们的测试中,is true产生了“全表扫描”,耗时 1.121 秒,而= true使用“键查找”执行,仅耗时 0.167 秒。该表有大约 300 万行。

  • @Erubiel 它与`WHERE flag IS TRUE` 相同。它进行了全表扫描。 (7认同)
  • 毕竟只是传递标志是一个布尔值怎么样......它更快吗?慢点?如`SELECT * FROM example WHERE flag` (3认同)