NULL ≠ 空字串 ≠ 0。本文系統整理 NULL 語意、比較邏輯、IS NULL/IFNULL/COALESCE 用法、索引限制、LOAD DATA 匯入、DISTINCT/GROUP BY/ORDER BY 行為、聚合函數忽略規則、TIMESTAMP/AUTO_INCREMENT 特殊處理。
NULL vs 空字串:語意差異
INSERT INTO t (phone) VALUES (NULL); -- 電話號碼未知
INSERT INTO t (phone) VALUES (''); -- 確定沒有電話
正確比較與處理函數
| 操作 | 正確寫法 | 錯誤寫法 |
| 判斷是否 NULL | col IS NULL | col = NULL |
| 判斷非 NULL | col IS NOT NULL | col != NULL |
| 替換 NULL 為預設值 | IFNULL(col, 'N/A') / COALESCE(col, 'N/A') | |
NULL 參與運算/比較結果永遠為 NULL
SELECT NULL, 1+NULL, CONCAT('abc', NULL);
-- 結果:NULL, NULL, NULL
索引與 NULL
- MyISAM、InnoDB、BDB、MEMORY:**允許 NULL 欄位建立索引**
- 其他引擎:索引欄位必須
NOT NULL
LOAD DATA INFILE 匯入 NULL
- 資料檔中用
\N(大寫 N)代表 NULL
- 某些情況下文字
NULL 也可
- 空值/缺漏欄位預設匯入空字串
''
DISTINCT / GROUP BY / ORDER BY
- 所有 NULL 視為**相等**(同一群組)
ORDER BY col ASC:NULL **最前**
ORDER BY col DESC:NULL **最後**
聚合函數對 NULL 的處理
| 函數 | 行為 |
COUNT(col) | **忽略 NULL**,只計非 NULL 筆數 |
COUNT(*) | 計**所有列**(含 NULL) |
SUM/AVG/MIN/MAX | **忽略 NULL** |
SELECT COUNT(*), COUNT(age) FROM person;
-- COUNT(*) = 總列數, COUNT(age) = 非 NULL 年齡筆數
特殊型別的 NULL 行為