核心概念區別
NULL:代表「未知、不存在」
'' (空字串):代表「已知為空」
INSERT INTO t(phone) VALUES (NULL); -- 電話號碼未知
INSERT INTO t(phone) VALUES (''); -- 確定沒有電話
比較運算陷阱
- NULL 與任何值比較 (含 NULL) 永遠不為 TRUE
- 包含 NULL 的運算式結果為 NULL (除特定函數文檔另有規定)
- 錯誤寫法:
WHERE phone = NULL → 永遠回傳 0 筆
- 正確寫法:
WHERE phone IS NULL / WHERE phone IS NOT NULL
NULL 處理函數與操作符
IS NULL / IS NOT NULL
IFNULL(expr1, expr2):expr1 為 NULL 回傳 expr2
COALESCE(val1, val2, ...):回傳第一個非 NULL 值
特殊場景行為
| 場景 | 行為 |
| 索引 | MyISAM/InnoDB/BDB/MEMORY 允許 NULL 欄位建索引;其他引擎需 NOT NULL |
| LOAD DATA INFILE | 空值/缺失欄位 → 空字串;需 NULL 請在資料檔用 \N |
| DISTINCT/GROUP BY/ORDER BY | 所有 NULL 視為等同 |
| ORDER BY | 預設 NULL 排最前;DESC 時排最後 |
| 彙總函數 COUNT/MIN/SUM | 忽略 NULL 值 |
| COUNT(*) | 計算列數,不忽略 NULL |
| TIMESTAMP 欄位插入 NULL | 自動填入當前日期時間 |
| AUTO_INCREMENT 欄位插入 NULL | 自動填入下一序號 |
實務建議
- 明確區分業務語義下的「未知」vs「空值」,選擇 NULL 或 NOT NULL + DEFAULT ''
- 查詢條件嚴禁使用
= NULL,務必用 IS NULL
- 彙總統計注意
COUNT(col) vs COUNT(*) 差異