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

MySQL處理NULL值兩大陷阱:TIMESTAMP自動賦值與NULL≠空字符串

     編輯:MySQL 資料庫相關知識

陷阱一:NULL不總是「空」—— TIMESTAMP/AUTO_INCREMENT特殊語義

CREATE TABLE t (
    user_id INT,
    dt TIMESTAMP
);
INSERT INTO t(user_id, dt) VALUES (1, NULL);
SELECT * FROM t;
-- 結果:dt = 當前系統時間,而非NULL!

規則:

  • TIMESTAMP列插NULL → **當前時間戳**
  • AUTO_INCREMENT列插NULL → **下一個自增值**
  • 其他類型(字符、數值等)插NULL → 真正存NULL

陷阱二:NULL ≠ 空字符串 ''

INSERT INTO t(val) VALUES (NULL), ('');
SELECT val FROM t;
-- 顯示:NULL  /  (空行)
SELECT * FROM t WHERE val IS NULL;      -- 命中第1行
SELECT * FROM t WHERE val = '';         -- 命中第2行
SELECT * FROM t WHERE val IS NOT NULL;  -- 命中第2行

業務含義區分:

  • NULL=**未知/未填寫**(如電話號碼從未收集)
  • ''=**明確為空/已取消**(如電話號碼曾有後註銷)

NULL專用運算符與函數行為

  1. IS NULL / IS NOT NULL:唯一正確判斷NULL的方式,= NULL永遠為UNKNOWN
  2. COUNT(col):**忽略NULL**,只統計非NULL值 → 統計「有電話的用戶」用COUNT(phone)
  3. COUNT(*):統計**所有行**(含NULL)
  4. SUM/AVG:自動跳過NULL
  5. ORDER BY:NULL排在**最前**(ASC)或**最後**(DESC)

最佳實踐

  • 業務語義明確區分NULL/'',**勿混用**
  • 字段默認NOT NULL+DEFAULT ''或0,除非真有「未知」狀態
  • 查詢條件**永遠用IS NULL**,禁用= NULL
  • 統計非空用COUNT(col),統計總行用COUNT(*)
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved