NULL Value
NULL 表示不存在的未知的值
NULL
means "a missing unknown value" or "not having a value"
操作NULL
使用 is null
和 is not null
操作符及ifnull
函數
特性
-
對
NULL
使用算術運算符,例如=
<
>
<>
,都會返回NULL
(無意義的結果)mysql> SELECT 1 = NULL, 1 <> NULL, 1 < NULL, 1 > NULL; +----------+-----------+----------+----------+ | 1 = NULL | 1 <> NULL | 1 < NULL | 1 > NULL | +----------+-----------+----------+----------+ | NULL | NULL | NULL | NULL | +----------+-----------+----------+----------+
-
任何包含
NULL
的表達式都會返回NULL
,除非文檔中針對表達式中涉及的運算符和函數另有說明An expression that contains
NULL
always produces aNULL
value unless otherwise indicated in the documentation for the operators and functions involved in the expressionmysql> SELECT NULL, 1+NULL, CONCAT('Invisible',NULL); +------+--------+--------------------------+ | NULL | 1+NULL | CONCAT('Invisible',NULL) | +------+--------+--------------------------+ | NULL | NULL | NULL | +------+--------+--------------------------+
-
在MySQL 中,
0
和NULL
被視爲false
,其他值被視爲true
(布爾操作符返回1
) -
InnoDB引擎支持在包含
NULL
的列上建立索引 -
在
group by
order by
distinct
中,兩個NULL
是相等的 -
在
order by
中,升序排序時,NULL
排在第一位;降序排序時,NULL
排在最後 -
在
where
中,算術運算符對NULL
而言,返回的都是NULL
,而NULL
被視爲false
,因此不滿足條件,不會返回 -
具有
NOT NULL
約束的列,可以插入0
和""
mysql> SELECT 0 IS NULL, 0 IS NOT NULL, '' IS NULL, '' IS NOT NULL; +-----------+---------------+------------+----------------+ | 0 IS NULL | 0 IS NOT NULL | '' IS NULL | '' IS NOT NULL | +-----------+---------------+------------+----------------+ | 0 | 1 | 0 | 1 | +-----------+---------------+------------+----------------+
-
聚合函數
COUNT()
MIN()
SUM
會忽略NULL
特別的
COUNT(*)
,計算的是行數,而非列值 -
字段類型是
TIMESTAMP
的列,插入NULL
會插入當前日期和時間5.7版本,實際測試插入的還是NULL
佔用空間
針對 InnoDB引擎
-
An SQL
NULL
value reserves one or two bytes in the record directory. An SQLNULL
value reserves zero bytes in the data part of the record if stored in a variable-length column. For a fixed-length column, the fixed length of the column is reserved in the data part of the record. Reserving fixed space forNULL
values permits columns to be updated in place fromNULL
to non-NULL
values without causing index page fragmentation.https://dev.mysql.com/doc/refman/8.0/en/innodb-row-format.html
-
A
LENGTH
ofNULL
isNULL
, aLENGTH
of an empty string is0
.
NULL和空字符串的區別
插入
mysql> INSERT INTO my_table (phone) VALUES (NULL); -- 插入 NULL
mysql> INSERT INTO my_table (phone) VALUES (''); -- 插入 "" (空字符串)
- 插入 NULL 值,表示手機號是「未知狀態」(不知道有沒有手機號)
- 插入空字符串,表示「沒有手機號」
查詢
mysql> SELECT * FROM my_table WHERE phone IS NULL;
mysql> SELECT * FROM my_table WHERE phone = '';
參考
https://dev.mysql.com/doc/refman/8.0/en/working-with-null.html
https://dev.mysql.com/doc/refman/8.0/en/problems-with-null.html