首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

MySQL NULL 值完整指南:與空字串區別、比較陷阱、索引與聚合行為、特殊處理

     編輯:MySQL 資料庫相關知識

NULL ≠ 空字串

INSERT INTO t (phone) VALUES (NULL);    -- 電話未知
INSERT INTO t (phone) VALUES ('');       -- 無電話(明確為空)

語意完全不同,業務邏輯必須區分。

正確判斷 NULL

錯誤寫法正確寫法說明
WHERE phone = NULLWHERE phone IS NULL= NULL 永遠為 UNKNOWN
WHERE phone != NULLWHERE phone IS NOT NULL同理
WHERE phone = ''WHERE phone = ''查空字串用等號

NULL 參與運算/函數結果

  • 算術:1 + NULL = NULL
  • 字串:CONCAT('a', NULL) = NULL
  • 比較:NULL = NULL → UNKNOWN (非 TRUE)
  • 邏輯:NULL AND TRUE = NULL、NULL OR FALSE = NULL

使用 IFNULL(expr, default)、COALESCE(a,b,c)、NULLIF(a,b) 顯式處理。

索引與 NULL

  • MyISAM、InnoDB、MEMORY、BDB 允許索引包含 NULL。
  • 其他引擎或舊版本需定義 NOT NULL 才能建索引。
  • 複合索引中任一欄為 NULL,該索引條目仍存在(InnoDB 將 NULL 視為最小值)。

聚合函數對 NULL 的處理

函數行為
COUNT(*)計算所有行(含 NULL)
COUNT(col)僅計算非 NULL 值
SUM/AVG/MIN/MAX忽略 NULL
GROUP_CONCAT忽略 NULL

排序與分組

  • ORDER BY col ASC:NULL 排最前;DESC 排最後。
  • GROUP BY、DISTINCT:所有 NULL 視為同一組。

特殊欄位類型的 NULL 行為

  • TIMESTAMP:INSERT NULL → 當前時間戳
  • AUTO_INCREMENT 整數欄:INSERT NULL → 下一個自增值

LOAD DATA INFILE 匯入 NULL

  • 檔案中用 \N (大寫 N) 表示 NULL。
  • 空欄位預設匯入為空字串 ''。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved