NULL表示值未知或未提供,会跳过COUNT、不参与比较;''是确定的空字符串,可比较可索引,COUNT会计入。语义不同,须按业务含义选择:未提交用NULL,明确提交空串用''。

UPDATE 字段为 NULL 和 '' 是语义完全不同的操作,不能互换,也不应凭直觉选一个。
UPDATE SET column = NULL 的实际效果
这表示“主动声明该字段值未知或未提供”,数据库会抹除当前值并标记为缺失状态:
-
NULL不参与任何等值比较:WHERE column = NULL永远不成立,必须写WHERE column IS NULL -
COUNT(column)会跳过该行,COUNT(*)则会计入 - 若字段有唯一约束,多数数据库(如 PostgreSQL、Oracle)允许插入多个
NULL(因NULL != NULL),MySQL 在某些模式下例外 - 字符串拼接中只要有一个
NULL,结果就是NULL,例如CONCAT('a', NULL)→NULL
UPDATE SET column = '' 的实际效果
这表示“明确赋一个长度为 0 的字符串值”,它是一个确定、可比较、可索引的有效数据:
- 可用
= ''或!= ''直接判断,LENGTH(column) = 0也成立 -
COUNT(column)会计入该行,SUM/AVG虽不适用,但字符串函数如TRIM(column)仍可安全调用 - 在唯一索引中,
''被视为真实值,重复插入会触发唯一冲突 - 某些数据库(如金仓、部分 MySQL 兼容模式)会在写入时悄悄把
''转成NULL,导致后续查询失配——这是静默故障高发点
什么时候该用 NULL,什么时候该用 ''?
取决于业务含义,不是技术偏好:
- 用户没填手机号 →
UPDATE user SET phone = NULL(真不知道) - 用户填了但提交的是空格或纯回车 → 清洗后存
'',再配合TRIM()判断是否真为空 - API 接口字段允许缺省(未传该字段)→ 后端应设为
NULL;若明确传了"phone": ""→ 存'' - 字段带
NOT NULL约束 → 不能设NULL,此时''是合理兜底,但需确认业务上是否接受“有值但为空”这个语义
容易被忽略的连锁影响
改一个 UPDATE 语句,可能牵出下游三处问题:
- 前端展示逻辑:有些框架对
NULL字段直接 omit,对''却渲染为空字符串,UI 表现不一致 - 报表口径:
COUNT(*)vsCOUNT(phone)vsCOUNT(NULLIF(phone, ''))结果不同,没人核对就上线会误导决策 - 索引失效风险:在
WHERE column IS NULL上建索引有效,但在WHERE column = ''上建索引,若字段大量为'',选择性差,优化器可能弃用










