在 MySQL 中,IS TRUE
和 = TRUE
这两个运算符确实会产生不同的结果,这是由 MySQL 对布尔值和比较运算的特殊处理方式造成的。
MySQL 没有真正的布尔类型:MySQL 使用 TINYINT(1)
来表示布尔值,TRUE
和 FALSE
实际上是 1
和 0
的别名。
比较运算的隐式转换:当使用 =
进行比较时,MySQL 会进行隐式类型转换。
IS 运算符的特殊性:IS
是专门用于与 TRUE
、FALSE
、UNKNOWN
(即 NULL
) 比较的运算符,不会进行类型转换。
SELECT 5 = TRUE; -- 返回 1 (TRUE),因为 5 被隐式转换为 1
SELECT 5 IS TRUE; -- 返回 0 (FALSE),因为 5 不等于 1
SELECT 'abc' = TRUE; -- 返回 0 (FALSE),字符串转换为 0
SELECT 'abc' IS TRUE; -- 返回 0 (FALSE)
SELECT NULL = TRUE; -- 返回 NULL
SELECT NULL IS TRUE; -- 返回 0 (FALSE)
使用 IS TRUE/IS FALSE 当你想明确检查布尔真值时,因为:
避免使用 = TRUE/= FALSE 除非你确实需要 MySQL 的特殊比较行为
考虑直接比较 对于非布尔列,直接与 1 或 0 比较可能更清晰:
WHERE column = 1 -- 替代 = TRUE
WHERE column = 0 -- 替代 = FALSE
IS TRUE
是严格的布尔真值检查,而 = TRUE
会进行隐式类型转换。理解这一差异对于编写正确的 MySQL 查询非常重要,特别是在处理可能包含非标准布尔值的数据时。