MySQL 裡 NULL(無值)與 ''(空字串)是兩碼事,混淆會導致查詢條件失效、統計偏差。本文深度解析差異,並給出精準刪除/查詢模板。
| 特性 | NULL | 空字串 '' |
|---|---|---|
| 含義 | 值不存在、未知 | 值存在、長度為 0 |
| 佔用空間 | 不佔用(視引擎而定) | 佔用 1 字節(含結束符) |
| 運算結果 | 任何運算 = NULL | 正常字串運算 |
| 判斷語法 | IS NULL / IS NOT NULL | = '' / != '' |
| 聚合函數 | COUNT(col) 不計入 | COUNT(col) 計入 |
| 唯一索引 | 允許多個 NULL | 視為相同值,僅允許一個 |
-- ❌ 錯誤:NULL 不能用 = 比較
SELECT * FROM t WHERE col = NULL; -- 永遠返回空集
-- ✅ 正確
SELECT * FROM t WHERE col IS NULL;
SELECT * FROM t WHERE col = '';
DELETE FROM t WHERE col IS NULL;DELETE FROM t WHERE col = '';DELETE FROM t WHERE col IS NULL OR col = '';-- 將 NULL 視為 0 參與運算
SELECT COALESCE(score, 0) FROM exam;
-- 統計非空、非空字串行數
SELECT COUNT(*) FROM t WHERE col IS NOT NULL AND col != '';
-- 分組去重時區分 NULL 與 ''
SELECT col, COUNT(*) FROM t GROUP BY col;
左連 A LEFT JOIN B 時,B 表無匹配行 → B 欄位填 NULL;右連同理。這是關係代數外連接語義決定的,非「缺失」。
col VARCHAR(50) NOT NULL DEFAULT ''(避免 NULL 麻煩)col VARCHAR(50) DEFAULT NULL,應用層統一寫入 NULL 而非 ''NULL 是「無」,空串是「有但空」;
判斷用 IS,比較用 =;
刪除分兩行,統計要分清;
建表設默認,業務少踩坑。