在以下查询中:

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.

推荐答案

在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 |
+---------+---------+

x没有前导数字的所有行计算为0,因此等于false.

Mysql相关问答推荐

如何在逗号分隔字符串值中使用LEFT函数

为分组记录MySQL取取值为TRUE的单行

获取连续11天未考勤的员工

查询优化并提高性能

GoRM中行最大值查询返回"0"

实体内约束的唯一增量 ID 生成

过滤值为0时如何在MySQL查询中设置条件?

按优先级 for each 具有 status_id 的员工 Select 单行

排序子查询结果并返回每个 ID 的第一行

根据 Power Query 中的条件替换值

为两个中的每一个 Select 最大和最小传递条件

Mysql JSON_REMOVE 数组键和值 (MariaDB)

如何让连续 3 周或以上的用户有订单?

Laravel 查询构建器 where() 用于何时产品必须有多个标签(使用 product_tags 数据透视表多对多)

如何使用 C++ 连接 mySQL 数据库

mysql 按日期 Select 总和组

在mysql中复制没有数据的数据库 struct (带有空表)

在 Ubuntu 上安装 mysql gem 的困难

"SELECT COUNT(*)" 很慢,即使有 where 子句

SELECT INTO 和未声明的变量错误