首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

MySQL NULL 值深度解析:概念、陷阱與最佳實踐

     編輯:MySQL 資料庫相關知識

核心認知:NULL ≠ 空字符串 ≠ 零

INSERT INTO my_table (phone) VALUES (NULL);   -- 電話號碼未知
INSERT INTO my_table (phone) VALUES ('');      -- 沒有電話(明確為空)

NULL 代表「值未知/不存在」,是一種狀態而非具體數值。

一、 比較運算的三值邏輯

  • NULL = NULL → FALSE(未知 = 未知,結果未知)
  • NULL <> NULL → FALSE
  • NULL > 5 → FALSE
  • 1 + NULL → NULL(任何含 NULL 運算結果為 NULL)
  • CONCAT('a', NULL) → NULL

結論:永遠不要用 = NULL 或 <> NULL 判斷,必須用 IS NULL / IS NOT NULL。

二、 查詢陷阱實戰

-- 錯誤:返回 0 行
SELECT * FROM my_table WHERE phone = NULL;

-- 正確:查找 NULL
SELECT * FROM my_table WHERE phone IS NULL;

-- 正確:查找空字符串
SELECT * FROM my_table WHERE phone = '';

三、 索引與 NULL

  • MySQL **允許** 為可空列建索引(早期版本限制已解除)。
  • 但主鍵列不能為 NULL(隱含 NOT NULL)。
  • 唯一索引允許多個 NULL(因 NULL ≠ NULL,不違反唯一性)。

四、 排序與分組行為

場景NULL 位置
ORDER BY col ASC最前面
ORDER BY col DESC最後面
GROUP BY col所有 NULL 歸為同一組

五、 處理 NULL 的實用函數

函數語法邏輯示例
IFNULLIFNULL(expr1, expr2)expr1 不為 NULL 返回 expr1,否則 expr2IFNULL(NULL, 'N/A') → 'N/A'
COALESCECOALESCE(v1, v2, ...)返回第一個非 NULL 參數(標準 SQL,推薦)COALESCE(NULL, NULL, 3) → 3
NULLIFNULLIF(expr1, expr2)兩值相等返回 NULL,否則返回 expr1NULLIF(5,5) → NULL
ISNULLISNULL(expr)expr 為 NULL 返回 1,否則 0(MySQL 特有)ISNULL(NULL) → 1

Oracle 對應:NVL(expr1, expr2) ≈ IFNULL;NVL2(expr1, expr2, expr3) 更強大。

六、 NOT NULL 約束 vs 空字符串

CREATE TABLE `test` (
  `col1` VARCHAR(10) NOT NULL,  -- 不允許 NULL
  `col2` VARCHAR(10) NULL       -- 允許 NULL
);
語句結果說明
INSERT VALUES (NULL, 1)報錯col1 禁止 NULL
INSERT VALUES ('', 1)成功空字符串 ≠ NULL
INSERT VALUES ('', NULL)成功col2 允許 NULL
SELECT * WHERE col1 IS NOT NULL返回所有行空字符串不為 NULL
SELECT * WHERE col1 <> ''僅返回非空字符串行精確過濾空串
SELECT * WHERE col2 <> ''同時排除 NULL 和空串隱性行為:<> '' 視 NULL 為「無意義內容」而過濾

七、 總結:NULL 處理黃金法則

  1. 語義區分:業務上「未知」用 NULL,「明確為空」用空串/0/特殊值。
  2. 查詢用 IS NULL:杜絕 = NULL。
  3. 運算防 NULL:COALESCE(col, 0)、IFNULL(col, '') 參與計算/拼接。
  4. 索引可建但慎用:大量 NULL 降低索引區分度,影響優化器決策。
  5. NOT NULL 只擋 NULL:空串照樣能存,勿混淆。
  6. <> '' 連帶過濾 NULL:利用此特性簡化「有實際內容」查詢。

理解 NULL 的三值邏輯與 MySQL 具體行為,是寫出正確、健壯 SQL 的基石。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved