CREATE TABLE t (
user_id INT,
dt TIMESTAMP
);
INSERT INTO t(user_id, dt) VALUES (1, NULL);
SELECT * FROM t;
-- 結果:dt = 當前系統時間,而非NULL!
規則:
TIMESTAMP列插NULL → **當前時間戳**AUTO_INCREMENT列插NULL → **下一個自增值**NULL → 真正存NULL''INSERT INTO t(val) VALUES (NULL), ('');
SELECT val FROM t;
-- 顯示:NULL / (空行)
SELECT * FROM t WHERE val IS NULL; -- 命中第1行
SELECT * FROM t WHERE val = ''; -- 命中第2行
SELECT * FROM t WHERE val IS NOT NULL; -- 命中第2行
業務含義區分:
NULL=**未知/未填寫**(如電話號碼從未收集)''=**明確為空/已取消**(如電話號碼曾有後註銷)IS NULL / IS NOT NULL:唯一正確判斷NULL的方式,= NULL永遠為UNKNOWNCOUNT(col):**忽略NULL**,只統計非NULL值 → 統計「有電話的用戶」用COUNT(phone)COUNT(*):統計**所有行**(含NULL)SUM/AVG:自動跳過NULLORDER BY:NULL排在**最前**(ASC)或**最後**(DESC)NULL/'',**勿混用**NOT NULL+DEFAULT ''或0,除非真有「未知」狀態IS NULL**,禁用= NULLCOUNT(col),統計總行用COUNT(*)