参考文献

NULL

  • 在 MySQL 中的 NULL 是一种特殊的数据.一个字段是否允许为 NULL,字段默认值是否为 NULL.
字段类型 表定义中设置方式 字段值
数值类型 (INT/BIGINT) Default NULL / Default 0 NULL / NUM
字符类型 (CHAR/VARCHAR) Default NULL / Default ” / Default ‘ab’ NULL / ” / String

NULL 与空字符存储上的区别

  • 表中如果允许字段为 NULL,会为每行记录分配 NULL 标志位.NULL 除了在每行的行首存有 NULL 标志位,实际存储不占有任何空间.如果表中所有字段都是非 NULL,就不存在这个标示位了

NULL的问题

数值类型,以 INT 列为例

  • 在 min / max / sum / avg 中 NULL 值会被直接忽略掉
  • NULL 做加减操作,如 1 + NULL,结果仍是 NULL
  • order by 以升序检索字段的时候 NULL 会排在最前面(倒序相反)
  • group by / distinct 时,NULL 值被视为相同的值
  • NULL 值无法与其他值进行常规比较(= 或 !=).因此需要使用 IS NULLIS NOT NULL 进行判断.

字符类型,在使用 NULL 值的时候,也需要格外注意

  • 字段是字符时,你无法一目了然的区分这个值到底是 NULL ,还是字符串’NULL

  • COUNT 函数对 NULL 的处理

    • COUNT(*) 会计算行数,不会忽略 NULL.
    • COUNT(column) 会忽略 NULL 值,仅计算非 NULL 的值.例如:COUNT(column) 只返回 column 非 NULL 值的数量.
  • 如果用 length 去统计一个 VARCHAR 的长度时,NULL 返回的将不是数字

  • 当对 NULL 值进行字符串拼接时,结果会是 NULL

    1
    SELECT CONCAT('hello', NULL); -- 返回 NULL
  • 使用LIKENULL 值进行匹配时,结果总是返回 NULL,不会有TRUEFALSE.

    1
    SELECT * FROM table WHERE column LIKE '%text%'; -- 如果 column 是 NULL,结果为 NULL