mysql中判断字段为空必须区分null和空字符串,因null不参与等值比较,= null恒为unknown;正确语法是is null/is not null,联合使用可覆盖“逻辑为空”场景。

MySQL 中判断字段是否为空,不能只靠 ''(空字符串)或 = '',必须区分 NULL 和空字符串两种情况;IS NULL 和 IS NOT NULL 是唯一能正确识别 NULL 值的语法。
为什么 = NULL 永远不成立
SQL 标准规定:NULL 不参与任何等值比较,col = NULL、col != NULL、col NULL 全部返回 UNKNOWN,在 WHERE 中等效于 false,查不到任何行。
- 错误写法:
SELECT * FROM users WHERE email = NULL→ 查不到任何记录,哪怕 email 真是NULL - 正确写法:
SELECT * FROM users WHERE email IS NULL - 同理,
email IS NOT NULL才能筛出非空值(注意:它会排除NULL,但不会排除'')
IS NULL 与空字符串 '' 必须分开处理
一个字段可能同时存在三种状态:NULL、''(空字符串)、有实际内容。业务上常需合并判断“逻辑为空”,这时不能只用 IS NULL。
- 只查
NULL:WHERE description IS NULL - 只查空字符串:
WHERE description = '' - 查所有“逻辑为空”:
WHERE description IS NULL OR description = '' - 更简洁写法(MySQL 特有):
WHERE COALESCE(description, '') = '',但要注意COALESCE有性能开销,索引可能失效
在 UPDATE 或 SELECT 中安全补默认值
直接用 IS NULL 判断后做逻辑分支容易冗长,推荐用 IFNULL() 或 COALESCE() 内联处理。
-
IFNULL(email, 'no-email@local'):仅对NULL生效,''会被原样保留 -
COALESCE(NULLIF(email, ''), 'no-email@local'):先用NULLIF(email, '')把空字符串转成NULL,再统一用COALESCE处理 —— 这才是真正覆盖两种“空”的组合技 - 避免误用
ISNULL():它是 MySQL 的布尔函数(返回 1 或 0),不是 Oracle/SQL Server 那种替换函数
真正容易被忽略的是:应用层传入的空字符串,和数据库初始化时未赋值产生的 NULL,在语义和存储上完全独立;不显式区分它们,后期查数据、加索引、写报表时都会踩坑。











