在 MySQL 中,IS TRUE
和 = TRUE
的行为确实存在差异,这是由 MySQL 的三值逻辑(TRUE, FALSE, NULL)和布尔值处理机制决定的。
IS TRUE
的行为:
= TRUE
的行为:
= TRUE
实际上等同于 = 1
-- 创建测试表
CREATE TABLE test_bool (id INT, value VARCHAR(10), flag BOOLEAN);
-- 插入测试数据
INSERT INTO test_bool VALUES
(1, 'true', TRUE),
(2, 'false', FALSE),
(3, '1', NULL),
(4, '0', TRUE),
(5, 'yes', FALSE),
(6, NULL, NULL);
-- IS TRUE 查询
SELECT id, value, flag FROM test_bool WHERE value IS TRUE;
-- 结果:id=1,3 (因为 'true' 和 '1' 被视为 TRUE)
-- = TRUE 查询
SELECT id, value, flag FROM test_bool WHERE value = TRUE;
-- 结果:id=1 (因为 TRUE 被转换为 1,只有 '1' 会匹配)
对于 BOOLEAN 类型的列: - MySQL 实际上用 TINYINT(1) 实现 BOOLEAN - TRUE 存储为 1,FALSE 存储为 0 - 但查询时行为依然有所不同:
-- IS TRUE 查询
SELECT id, flag FROM test_bool WHERE flag IS TRUE;
-- 结果:id=1,4 (flag 为 TRUE 或 1 的记录)
-- = TRUE 查询
SELECT id, flag FROM test_bool WHERE flag = TRUE;
-- 结果:id=1,4 (与 IS TRUE 相同,因为 flag 是布尔列)
IS TRUE
会排除 NULL 值= TRUE
也会排除 NULL 值IS TRUE
/IS FALSE
更明确IS NOT DISTINCT FROM
(某些数据库)或显式处理 NULL理解这些差异有助于编写更准确、可预测的 SQL 查询语句。