IS NULL 只匹配真正为 NULL 的值,不匹配空字符串、空白字符串或数字 0;各数据库对该语法支持一致,但索引对 NULL 的处理及字符串比较行为存在差异。

WHERE col IS NULL 为什么查不到空字符串或空白格
因为 IS NULL 只匹配数据库中真正为 NULL 的值,不匹配空字符串 ''、全是空格的字符串 ' ' 或数字 0。这是 SQL 标准行为,不是 bug。
-
NULL表示“未知/缺失”,而''是一个已知的、长度为 0 的字符串 - 用
= ''或LIKE ''才能查空字符串;用TRIM(col) = ''查纯空白 - 某些 ORM(如 Django ORM)或可视化工具会把空字符串自动转成
NULL,但原生 SQL 不会
IS NULL 在不同数据库里的写法完全一致吗
核心语法 WHERE col IS NULL 在 MySQL、PostgreSQL、SQL Server、SQLite、Oracle 中都支持且行为一致——这点很省心。
- 但注意:Oracle 对字符串比较默认忽略尾部空格,
WHERE name IS NULL没问题,但WHERE name = ''可能意外命中含空格的行 - PostgreSQL 区分
NULL和'NULL'字符串,后者是文本,不是空值 - MySQL 8.0+ 支持
IS NOT NULL短路优化,但老版本对OR条件中混用IS NULL可能走不了索引
给 NULL 列加索引后 WHERE IS NULL 还能走索引吗
能,但取决于数据库实现和索引类型——不是所有索引默认存 NULL。
- MySQL 的 B-tree 索引默认**包含**
NULL值,WHERE status IS NULL可走索引(需该列在索引最左前缀) - PostgreSQL 的普通 B-tree 索引**默认跳过**
NULL,除非显式加上INCLUDE NULLS(v15+)或用表达式索引CREATE INDEX ON t ((status IS NULL)) - 复合索引如
(a, b),当查询WHERE a = 1 AND b IS NULL时,MySQL 能用上,但若写成WHERE b IS NULL单独查,基本走不了索引
用 COALESCE 或 NULLIF 替代 IS NULL 有哪些隐患
它们不是 IS NULL 的替代品,而是不同用途的工具——强行套用容易出逻辑错误。
-
COALESCE(col, 'N/A')用于显示替换,但WHERE COALESCE(col, '') = ''会把原NULL和空字符串全混在一起,失去区分能力 -
NULLIF(col, '')把空字符串转成NULL,但多次嵌套会让可读性暴跌,比如NULLIF(TRIM(col), '')已经是常见底线 - 在
GROUP BY或ORDER BY中用COALESCE隐式转换类型,可能触发隐式类型转换警告甚至报错(如 PostgreSQL 中 text vs varchar)
真要统一处理空值场景,优先考虑业务层归一化,而不是在 SQL 里堆函数。NULL 就是 NULL,别急着“修”它。

















