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

MySQL NULL 值完全指南:與空字串的差異、比較陷阱、索引限制與最佳實踐

     編輯:MySQL 資料庫相關知識

NULL 代表「未知」或「不存在」,與空字串 ''、數值 0 截然不同。誤解 NULL 行為是 SQL 新手最常見的 Bug 來源。

核心差異對照

操作NULL空字串 ''
含義電話號碼未知確定沒有電話
插入語法INSERT ... VALUES (NULL)INSERT ... VALUES ('')
= NULL 比較永遠為 FALSE可比較
正確判斷IS NULL / IS NOT NULL= '' / != ''
COUNT(col)不計入計入
COUNT(*)計入列數計入列數
排序 ORDER BY預設最前(ASC)/ 最後(DESC)正常排序
DISTINCT/GROUP BY視為相同值群組正常群組

常見陷阱與正確寫法

❌ 錯誤:WHERE phone = NULL

SELECT * FROM users WHERE phone = NULL;  -- 永遠回傳 0 筆

✅ 正確:WHERE phone IS NULL

SELECT * FROM users WHERE phone IS NULL;     -- 找未填電話
SELECT * FROM users WHERE phone = '';        -- 找明確填空字串
SELECT * FROM users WHERE phone IS NOT NULL; -- 找已填電話

運算式中攜帶 NULL 結果為 NULL

SELECT 1 + NULL;        -- NULL
SELECT CONCAT('A', NULL); -- NULL
SELECT NULL = NULL;     -- NULL (非 TRUE)

使用 IFNULL()、COALESCE()、NULLIF() 處理:

SELECT IFNULL(phone, '未提供');      -- NULL 時顯示預設值
SELECT COALESCE(mobile, phone, '無'); -- 取第一個非 NULL
SELECT NULLIF(col, '');              -- 空字串轉 NULL

特殊場景行為

  • 索引限制:MyISAM/InnoDB/BDB/MEMORY 允許 NULL 欄位建索引;其他引擎需 NOT NULL
  • LOAD DATA INFILE:空值寫入 '';需寫 \N (大寫 N) 才存入 NULL
  • TIMESTAMP 欄位插入 NULL:自動填入當前時間
  • AUTO_INCREMENT 插入 NULL:自動填入下一序號
  • 聚合函數:SUM/AVG/MIN/MAX 忽略 NULL;COUNT(col) 忽略 NULL;COUNT(*) 計算列數

最佳實踐建議

  1. 預設所有欄位 NOT NULL,除非業務真正需要「未知」語意
  2. 字串欄位用空字串 '' 當預設值,避免 NULL 處理複雜度
  3. 數值欄位用 0 或 -1 當預設值,而非 NULL
  4. 查詢條件永遠用 IS NULL/IS NOT NULL 判斷 NULL
  5. 應用層統一處理 NULL 轉換,不要讓 NULL 流入業務邏輯判斷
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved