MySQL 中 NULL (無值) 與 '' (空字符串,長度 0) 是**完全不同**的兩個概念。混淆二者會導致查詢條件失效、統計錯誤、索引異常。本文從存儲本質、運算行為、判斷語法、刪除策略四個維度徹底釐清,附實測驗證。
| 特性 | NULL | 空字符串 ('') |
|---|---|---|
| 語義 | 值不存在、未知、不適用 | 值存在、長度為 0 的字符串 |
| 物理存儲 | 不佔用數據頁空間 (僅在 NULL 位圖標記 1 bit) | 佔用 1-2 字節 (長度前綴 + 0 字符) |
| 字符串結束符 | 無 | 含隱式 \0 結束符 |
| NOT NULL 約束 | 禁止插入 NULL | 允許插入 '' |
| 自增/默認值填充 | 插入 NULL 觸發自增/默認值 | 插入 '' 不觸發,實際存 '' |
SELECT 1 + NULL; -- NULL (任何與 NULL 運算結果為 NULL)
SELECT CONCAT('a', NULL); -- NULL
SELECT 1 + ''; -- 1 (空串隱式轉為 0)
SELECT CONCAT('a', ''); -- 'a'
SELECT NULL = NULL; -- NULL (未知),非 TRUE
SELECT NULL <> NULL; -- NULL
SELECT NULL <=> NULL; -- 1 (MySQL 專用 NULL 安全等值)
SELECT '' = ''; -- 1 (TRUE)
SELECT '' <> ''; -- 0 (FALSE)
SELECT IF(NULL, 'T', 'F'); -- 'F' (NULL 視為 FALSE)
SELECT IF('', 'T', 'F'); -- 'F' (空串視為 FALSE)
SELECT IF('x', 'T', 'F'); -- 'T'
| 目的 | 正確語法 | 錯誤語法 |
|---|---|---|
| 判斷是否為 NULL | col IS NULL / col IS NOT NULL | col = NULL / col != NULL |
| 判斷是否為空串 | col = '' / col <> '' / LENGTH(col) = 0 | col IS NULL |
| NULL 安全等值 | col <=> val | col = val (val 為 NULL 時失效) |
| 空值轉默認 (SQL層) | IFNULL(col, 'default') / COALESCE(col, 'default') | 應用層遍歷 |
| 空串轉默認 (SQL層) | IF(col='', 'default', col) / NULLIF(col, '') 配合 COALESCE | - |
DELETE FROM tbl WHERE col IS NULL;
-- 或批量多列
DELETE FROM tbl WHERE col1 IS NULL OR col2 IS NULL;
DELETE FROM tbl WHERE col = '';
-- 或 TRIM 後為空 (含空白字符)
DELETE FROM tbl WHERE TRIM(col) = '';
DELETE FROM tbl WHERE col IS NULL OR col = '';
-- 簡寫 (利用 IFNULL/COALESCE)
DELETE FROM tbl WHERE IFNULL(col, '') = '';
-- 或
DELETE FROM tbl WHERE COALESCE(col, '') = '';
Table A: id, name Table B: id, address
1, 'Alice' 1, 'Shanghai'
2, 'Bob' 3, 'Beijing'
SELECT A.id, A.name, B.address
FROM A LEFT JOIN B ON A.id = B.id;
-- 結果:
-- 1, 'Alice', 'Shanghai'
-- 2, 'Bob', NULL -- B 中無 id=2,address 為 NULL (非空串)
SELECT A.id, A.name, B.address
FROM A RIGHT JOIN B ON A.id = B.id;
-- 結果:
-- 1, 'Alice', 'Shanghai'
-- 3, NULL, 'Beijing' -- A 中無 id=3,name 為 NULL
這是 NULL 產生的**根本来源**:外連接無匹配行時的填充值,非人為插入。
NULL 無值佔位圖、空串有值長度零;運算比較 NULL 致 NULL、空串正常參與;IS NULL 判空值、等空串判空串;刪除精準分兩類、業務合一用 COALESCE;LEFT JOIN 產生 NULL、外連接本質記心頭。