首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> MySQL 資料庫 >> MySQL 綜合教學

MySQL NULL 值處理兩大陷阱:TIMESTAMP 自動賦值與 NULL ≠ 空字串的統計差異

     編輯:MySQL 綜合教學

MySQL NULL 值處理兩大陷阱:TIMESTAMP 自動賦值與 NULL ≠ 空字串的統計差異

NULL 在 MySQL 中不是「空」,而是「未知/不存在」。兩大經典陷阱常導致資料不符預期。

陷阱一:NULL 不一定是空值

特定欄位類型插入 NULL 會觸發隱式預設行為:

  • TIMESTAMP:插入 NULL → 自動寫入 當前系統時間
  • AUTO_INCREMENT:插入 NULL → 自動產生 遞增整數
  • 其他類型(CHAR、INT 等):插入 NULL → 真正儲存 NULL
CREATE TABLE t (id INT, dt TIMESTAMP);
INSERT INTO t (id, dt) VALUES (1, NULL);
SELECT * FROM t;  -- dt 顯示為執行 INSERT 當下的時間

對策:明確指定預設值或使用 NOT NULL 避免隱式行為。

陷阱二:NULL ≠ 空字串 ('')

INSERT INTO t (col) VALUES (NULL), ('');
SELECT col FROM t;
-- 結果:NULL 顯示為 NULL,空字串顯示為 (空白)

業務語義不同:

  • NULL:未知(如電話號碼從未收集)
  • 空字串:已知為空(如用戶主動清空電話)

NULL 專用運算子與函數行為

  1. IS NULL / IS NOT NULL:唯一正確判斷 NULL 的方式
    SELECT * FROM users WHERE phone IS NULL;  -- 找出未填電話的用戶
  2. COUNT(col):忽略 NULL,只統計非 NULL 個數
    SELECT COUNT(phone) FROM users;  -- 只算有電話的用戶數
    COUNT(*) 統計全部行數(含 NULL)。
  3. 比較運算子:NULL = NULL → UNKNOWN,NULL <> '' → UNKNOWN,任何與 NULL 比較皆非 TRUE

最佳實踐建議

  1. 業務上「無值」優先用 NULL,配合 IS NULL 判斷
  2. 欄位定義 NOT NULL DEFAULT '' 或 DEFAULT 'N/A' 避免 NULL 複雜度
  3. 統計時區分 COUNT(col)(非空計數)與 COUNT(*)(總行數)
  4. TIMESTAMP 欄位若不想自動賦值,改用 DATETIME 或明確 DEFAULT '1970-01-01'

理解 NULL 語義,才能寫出正確的 SQL 與業務邏輯。

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