必须分开处理 NULL 和 '';查“逻辑为空”需显式写 IS NULL OR = '';CASE 判空须先 IS NULL 再 = '';用 COALESCE(NULLIF(col,''),'默认') 统一填充;二者语义与存储完全独立。

必须分开处理 NULL 和 '',不能靠一个条件覆盖两者;业务上所谓“空”,往往指“逻辑为空”,需要显式组合判断。
WHERE 中查 NULL 或空字符串:必须用 IS NULL OR = ''
直接写 WHERE column_name = '' 只能命中空字符串,对 NULL 完全无效——因为 NULL = '' 返回 UNKNOWN,被 WHERE 当作 false 过滤掉。
- 查纯
NULL:用WHERE column_name IS NULL - 查纯空字符串:用
WHERE column_name = '' - 查“逻辑为空”(NULL 或
''):必须写成WHERE column_name IS NULL OR column_name = '' - 别用
IN (NULL, ''):SQL 标准里NULL无法参与IN比较,该写法恒为false
SELECT 中标记状态:优先用 CASE,IS NULL 必须放前面
如果要在结果里把字段分成“空值”、“空串”、“有值”三类,CASE 比嵌套 IF() 更清晰,且顺序关键:必须先判 IS NULL,再判 = '',否则 NULL 会被后续条件跳过或误判。
面向 CRM 系统的 MySQL 8 数据库模式设计。当用户需要为客户关系管理(CRM)系统设计、评审、优化或生成数据库模式时,应使用此项技能。
SELECT
name,
CASE
WHEN name IS NULL THEN '空值'
WHEN name = '' THEN '空串'
ELSE '有值'
END AS status
FROM users;
-
IF()嵌套也能做,但可读性差、易漏分支,比如IF(name IS NULL, '空值', IF(name = '', '空串', '有值')) - 别写
IF(IFNULL(name, '') = '', ...)做状态标记——它把两类“空”合并了,丢失语义区分
UPDATE 或默认值填充:用 COALESCE(NULLIF(...), ...) 组合技
想把 NULL 和 '' 都替换成统一默认值(比如 '未填写'),单用 IFNULL() 不行——它只管 NULL,对 '' 无感;而 NULLIF(col, '') 能先把空字符串转成 NULL,再交给 COALESCE() 统一兜底。
- 安全写法:
COALESCE(NULLIF(email, ''), '未填写') - 错误写法:
IFNULL(email, '未填写')→ 若email = '',结果仍是'' - 性能注意:
COALESCE(NULLIF(...))在WHERE中会阻止索引使用(除非 MySQL 8.0+ 函数索引已建好)
容易被忽略的底层事实:NULL 和 '' 存储与语义完全独立
数据库里 NULL 表示“缺失/未知”,'' 是一个真实存在的、长度为 0 的字符串。它们在 B+ 树索引中存储方式不同,联合索引中排序位置也不同;应用层传入的空表单字段,可能存成 NULL(没传该字段),也可能存成 ''(传了但值为空),不从建表 NOT NULL 约束和 INSERT 逻辑上统一管控,后期加索引、写报表、对接 BI 工具时必然反复踩坑。










