NULL 在 MySQL 中不是「空」,而是「未知/不存在」。兩大經典陷阱常導致資料不符預期。
特定欄位類型插入 NULL 會觸發隱式預設行為:
CREATE TABLE t (id INT, dt TIMESTAMP);
INSERT INTO t (id, dt) VALUES (1, NULL);
SELECT * FROM t; -- dt 顯示為執行 INSERT 當下的時間
對策:明確指定預設值或使用 NOT NULL 避免隱式行為。
INSERT INTO t (col) VALUES (NULL), ('');
SELECT col FROM t;
-- 結果:NULL 顯示為 NULL,空字串顯示為 (空白)
業務語義不同:
SELECT * FROM users WHERE phone IS NULL; -- 找出未填電話的用戶
SELECT COUNT(phone) FROM users; -- 只算有電話的用戶數
COUNT(*) 統計全部行數(含 NULL)。NULL = NULL → UNKNOWN,NULL <> '' → UNKNOWN,任何與 NULL 比較皆非 TRUENULL,配合 IS NULL 判斷NOT NULL DEFAULT '' 或 DEFAULT 'N/A' 避免 NULL 複雜度COUNT(col)(非空計數)與 COUNT(*)(總行數)DATETIME 或明確 DEFAULT '1970-01-01'理解 NULL 語義,才能寫出正確的 SQL 與業務邏輯。