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

MySQL NULL 值處理兩大陷阱:Timestamp 自動賦值與 NULL != 空字符串

     編輯:MySQL 資料庫相關知識

陷阱一:NULL 不一定是「空」—— 特殊類型的隱式行為

現象演示

CREATE TABLE t1 (
  user_id INT,
  dt TIMESTAMP
);

INSERT INTO t1 (user_id, dt) VALUES (1, NULL);
SELECT * FROM t1;

結果:dt 顯示為 插入時的當前時間戳,而非 NULL!

TIMESTAMP插入NULL結果

規則總結

原因:MySQL 為這兩類列定義了特殊的「隱式默認值」邏輯,NULL 觸發默認值生成機制。

最佳實踐

  • 明確插入值:INSERT ... VALUES (1, '2023-01-01 00:00:00')
  • 需存儲 NULL 的 TIMESTAMP 列,定義時顯式指定 DEFAULT NULL 並允許 NULL:
    dt TIMESTAMP NULL DEFAULT NULL
  • 避免在應用層依賴「插入 NULL 會存 NULL」的假設。

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

現象演示

CREATE TABLE t2 (c1 VARCHAR(10));
INSERT INTO t2 VALUES (NULL), ('');
SELECT c1, LENGTH(c1), CHAR_LENGTH(c1) FROM t2;

結果:

列類型/屬性插入 NULL 的實際行為
普通類型 (CHAR, INT 等)存儲 NULL
TIMESTAMP存儲當前時間戳
AUTO_INCREMENT存儲下一個自增值
c1LENGTHCHAR_LENGTH顯示
NULLNULLNULLNULL
''00(空行)

NULL與空字符串查詢結果

業務語義區分

  • NULL:未知、不適用、尚未錄入 (如「電話號碼未知」)
  • '':明確知道為空、已清空 (如「用戶註銷了電話」)

SQL 操作差異

1. 判斷 NULL 的專用運算符

WHERE phone IS NULL      -- 是 NULL
WHERE phone IS NOT NULL  -- 非 NULL

錯誤寫法:WHERE phone = NULL (永遠為 UNKNOWN,不返回任何行)

IS NULL查詢示例

2. 聚合函數自動忽略 NULL

SELECT COUNT(phone) FROM t2;  -- 結果 1 (只統計 '')
SELECT COUNT(*) FROM t2;      -- 結果 2 (統計所有行)

利用特性:COUNT(col) 可直接統計「有值」的行數,無需 WHERE col IS NOT NULL。

3. 比較運算

NULL = NULL   -- UNKNOWN (非 TRUE)
'' = ''       -- TRUE
NULL > 0      -- UNKNOWN

綜合建議

  1. 表設計階段:根據業務語義決定列是否允許 NULL,默認建議 NOT NULL + 合理的默認值。
  2. TIMESTAMP 列:明確業務是否需要「自動記錄創建/更新時間」,不需要則定義為 TIMESTAMP NULL DEFAULT NULL。
  3. 查詢編寫:永遠使用 IS NULL/IS NOT NULL 判斷 NULL,不用 =/!=。
  4. 統計分析:善用 COUNT(col) 忽略 NULL 特性,簡化查詢。
  5. 應用層:ORM 框架映射時區分 NULL 與空字符串,避免混淆。

理解這兩個核心陷阱,能避免 80% 以上與 NULL 相關的疑難雜癥。

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