MySQL中NULL的處理和特性

NULL Value

NULL 表示不存在的未知的值

NULL means "a missing unknown value" or "not having a value"

操作NULL

使用 is nullis 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 a NULL value unless otherwise indicated in the documentation for the operators and functions involved in the expression

    mysql> SELECT NULL, 1+NULL, CONCAT('Invisible',NULL);
    +------+--------+--------------------------+
    | NULL | 1+NULL | CONCAT('Invisible',NULL) |
    +------+--------+--------------------------+
    | NULL |   NULL | NULL                     |
    +------+--------+--------------------------+
    
  • 在MySQL 中,0NULL 被視爲 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 SQL NULL 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 for NULL values permits columns to be updated in place from NULL to non-NULL values without causing index page fragmentation.

    https://dev.mysql.com/doc/refman/8.0/en/innodb-row-format.html

  • A LENGTH of NULL is NULL, a LENGTH of an empty string is 0.

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章