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

null是表示“缺失”或“未知”的特殊状态标记,非0、空字符串或false;判断须用is null/is not null;运算和比较结果为null;聚合函数count(col)忽略null,但count(*)统计所有行。

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

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

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

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

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

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

不能写 WHERE phone = NULLWHERE 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 索引)