MySQL中如何判断等于false或true

3
在下面的查询中:
select count(1) from main_territory where code = true
union all
select count(1) from main_territory where code = false;

-------------------------------------------------------------------
count(1)
0
250

为什么在查询中加入0false会返回所有行?
无论数据是什么,都不重要,这里提供一个示例:
CREATE TABLE z_tmp (x varchar(11));
insert into z_tmp values ('x'); -- note this is not a Boolean
select count(1) from z_tmp where x=true union all select count(1) from z_tmp where x=false;

注意:我正在使用mysql5.7。

1
能否提供样本数据会有所帮助。您假设我们知道表中的内容,但实际上我们并不知道。 - Tim Biegeleisen
在你的第二个例子中,整数值1在插入期间被强制转换为'1'。这个值是真实的,所以是真的。这里除了类型的强制转换之外没有什么事情发生了。 - Tim Biegeleisen
@TimBiegeleisen 抱歉,那是个打错字,请现在查看问题。 - David542
这是因为varchar字面量被转换为false。如果它们不以1开头,则转换将为false。 - Tim Biegeleisen
@TimBiegeleisen 哦,我明白了。那似乎有点奇怪,我认为相反的情况可能会发生 - 布尔值将被转换为字符串。这在mysql中是否被认为是奇怪的语法,还是大多数其他数据库也这样做? - David542
显示剩余4条评论
1个回答

3
在MySQL中,true字面上是整数1,false则是整数0。这种方式与其他SQL实现不同且非标准,但这就是MySQL的工作方式。
mysql> select true, false;
+------+-------+
| true | false |
+------+-------+
|    1 |     0 |
+------+-------+

当你将一个整数与一个字符串进行比较时,字符串会被转换为它的整数值,该整数值基于字符串中的任何前导数字字符。如果没有前导数字,则整数值为0。

因此,你正在比较 0=10=0

mysql> select 'x' = 1, 'x' = 0;
+---------+---------+
| 'x' = 1 | 'x' = 0 |
+---------+---------+
|       0 |       1 |
+---------+---------+

所有以数字开头的行都会被视为0,因此等同于false


谢谢,那似乎很奇怪。你知道还有哪些数据库系统会根据其前导字符是否为“1”来尝试将字符串转换为布尔值吗? - David542
1
它不是转换为布尔值,而是转换为数字。在标准SQL中,如果字符串不包含有效的数字格式(可选前导空格),则将字符串转换为数字会失败并出现错误。请参阅https://crate.io/docs/sql-99/en/latest/chapters/07.html#cast。 - Bill Karwin
1
@David542 MySQL 或许是 SQL 数据库语法方面最宽松的。严格来说,直接将字符串与布尔值进行比较是毫无意义的。在其他数据库中,你可能会得到错误提示,甚至出现不同的行为。 - Tim Biegeleisen
2
是的,你应该会得到一个错误,因为在标准 SQL 中,有一个真正的 BOOL 数据类型,它与整数不同。但在 MySQL 中,它是一样的。您可以在算术表达式中使用逻辑比较:SUM(mycolumn = 1234),它对表达式为“true”的行求和1。这在其他 SQL 实现中会引发错误。您需要使用 SUM(CASE mycolumn WHEN 1234 THEN 1 END) 将布尔结果映射到整数1。 - Bill Karwin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接