mysql中的NULL表示什么_mysql NULL值概念解析

来源:这里教程网 时间:2026-02-28 20:49:14 作者:

MySQL 中的 NULL 表示“缺失”或“未知”的值,它不是 0、空字符串('')、空格,也不是布尔假(FALSE),而是一种特殊的**状态标记**,用来说明这个字段当前没有有效数据,其真实值不可知。

NULL 的本质是“未知”,不是“空”

比如用户注册时没填手机号,数据库里存 NULL,意思是“我们不知道他有没有手机号”;而如果存了空字符串 '',则暗示“我们知道他提供了信息,但内容为空”。这种语义差异直接影响业务逻辑判断和统计准确性。

NULL ≠ NULL:两个 NULL 比较结果仍是 NULL(三值逻辑中的 UNKNOWN) NULL 参与任何运算(如 +、-、*、=、)都会让整个表达式结果为 NULL 主键、唯一索引列默认不允许 NULL(除非显式声明允许)

怎么正确判断 NULL?只能用 IS NULL / IS NOT NULL

不能写

WHERE phone = NULL
WHERE phone != NULL
—— 这类写法永远不返回数据,因为比较结果恒为 UNKNOWN,被 WHERE 当作 false 处理。

查空手机号:
SELECT * FROM users WHERE phone IS NULL
查已填手机号:
SELECT * FROM users WHERE phone IS NOT NULL
错误示范:
WHERE age = NULL
→ 无结果;
WHERE age  18
若 age 是 NULL,该行也不会被选中

如何安全处理 NULL?常用函数有 IFNULL 和 COALESCE

避免 NULL 波及计算或展示,推荐在查询层做兜底:

IFNULL(phone, '未提供')
:仅支持两个参数,简洁常用
COALESCE(phone, mobile, backup_phone, '全部缺失')
:按顺序取第一个非 NULL 值,更灵活
聚合函数如 COUNT(col) 自动忽略 NULL;但 COUNT(*) 统计所有行,含 NULL 行

建表时就要想清楚:哪些字段该允许 NULL?

设计阶段就应明确字段语义:

必填字段(如 user_id、created_at)必须加
NOT NULL
可选字段(如 remark、avatar_url)可设
DEFAULT NULL
(显式优于隐式)
避免用空字符串或 0 代替 NULL 来“假装有值”,否则会混淆业务含义 索引列允许 NULL 时,该索引项仍可被使用(InnoDB 支持对 NULL 建 B+Tree 索引)

相关推荐