is NULL 是 mysql 中唯一可靠的空值判断方式,因 null 是缺失值标记而非值,= null 永返 null;需用 is null/is not null,且须区分 null、” 和 0。

MySQL 中 IS NULL 是唯一可靠的空值判断方式
MySQL 的 NULL 不是值,而是“缺失值”的标记,因此不能用 = NULL 或 != NULL 判断——这些表达式永远返回 NULL(即逻辑假),查不到任何结果。必须用 IS NULL 和 IS NOT NULL。
常见错误现象:select * FROM user WHERE name = NULL 返回空结果集,即使表里真有 name 为 NULL 的记录。
-
WHERE col = NULL→ 永远不匹配,等价于WHERE NULL -
WHERE col IS NULL→ 正确匹配该列为NULL的行 -
WHERE col NULL→ 这是 MySQL 特有的“安全等于”,可替代IS NULL,但语义稍隐晦,不推荐初学者依赖
区分 NULL、空字符串 '' 和数值 0
三者在 MySQL 中完全独立:一个字段可以是 NULL(未赋值)、''(明确赋了空字符串)、或 0(数值零)。查询时必须分开处理。
例如用户注册表中 phone 字段:
-
IS NULL→ 用户没填手机号(字段值为空) -
= ''→ 用户填了但提交的是空字符串(可能是前端校验漏掉) -
IS NULL OR phone = ''→ 合并两种“无效手机号”场景
注意:Length(phone) = 0 无法捕获 NULL,因为 LENGTH(NULL) 返回 NULL,需配合 IS NULL 使用。
IS NULL 在索引和性能上的实际影响
如果字段有普通 B+Tree 索引(如 INDEX(name)),WHERE name IS NULL 可以走索引——前提是该索引允许 NULL(InnoDB 默认允许)。但要注意:
- 联合索引中,只有最左前缀包含
IS NULL字段且其左侧全为等值条件时,才可能命中索引 -
ORDER BY ... DESC配合IS NULL时,NULL默认排在最前(升序)或最后(降序),行为可被ORDER BY col IS NULL, col显式控制 - 使用
IFNULL()或COALESCE()包裹字段后判断(如IFNULL(name, '') = '')会强制索引失效
批量更新或删除时如何安全处理 NULL
写 UPDATE 或 delete 语句时,IS NULL 的逻辑必须显式写出,不能靠默认值或隐式转换。
示例:把所有未填邮箱的用户状态设为待验证
UPDATE user SET status = 'pending' WHERE email IS NULL;
容易踩的坑:
-
WHERE email = ''不会更新NULL行,哪怕业务上认为“没填”和“填了空串”等价 -
SET email = NULL和SET email = ''效果完全不同,前者清空字段值为NULL,后者设为空字符串 - 如果字段定义为
NOT NULL default '',插入时省略该字段会自动填'',而非NULL,此时IS NULL永远查不到它
真正要小心的,是字段定义本身是否允许 NULL,以及应用层插入数据时到底传了什么——数据库只认你写进去的字面量,不猜意图。