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

MySQL NULL 與空字符串、空格深度解析:COUNT、索引、主鍵、時間戳行為差異

     編輯:MySQL 資料庫相關知識

NULL(無值)與 ''(空字符串,有值但長度 0)在 MySQL 中語義、存儲、統計、索引、主鍵約束、時間戳默認值等方面差異顯著。本文通過實測案例逐項拆解。

一、核心語義區別

  • NULL:值不存在、未知、不適用。NULL = NULL 為 UNKNOWN(非 TRUE)。
  • '':值存在,長度為 0 的字符串。'' = '' 為 TRUE。

二、實測案例:時間戳欄位

CREATE TABLE ceshi (id INT, createDate TIMESTAMP);

-- 1. 插入 NULL
INSERT INTO ceshi VALUES (1, NULL);
SELECT * FROM ceshi;
-- 結果:createDate = 當前系統時間(TIMESTAMP 默認 CURRENT_TIMESTAMP)

-- 2. 插入空字符串
INSERT INTO ceshi VALUES (2, '');
SELECT * FROM ceshi;
-- 結果:createDate = '0000-00-00 00:00:00'(零時間戳)

-- 3. VARCHAR 欄位插入 NULL vs ''
ALTER TABLE ceshi ADD name VARCHAR(10);
INSERT INTO ceshi (name) VALUES (NULL);
INSERT INTO ceshi (name) VALUES ('');
SELECT * FROM ceshi;
-- name 列顯示均為 NULL(客戶端顯示),但統計行為不同

三、統計函數行為差異

SELECT COUNT(name) FROM ceshi;
-- 結果:1(僅計算非 NULL 值,'' 被計算,NULL 不計算)

SELECT COUNT(*) FROM ceshi;
-- 結果:4(計算所有行)

規則: 聚合函數(COUNT(col)、SUM、AVG 等)**忽略 NULL**,但**不忽略空字符串/零值**。

四、索引與主鍵約束

  • 主鍵列:禁止 NULL(PRIMARY KEY 隱含 NOT NULL),可存 ''(字符串主鍵極不推薦)。
  • 唯一索引:允許**多個 NULL**(視為不相等),但**只允許一個空字符串**。
  • 普通索引:NULL 值**被索引**(InnoDB/MYISAM 均索引 NULL),可通過 WHERE col IS NULL 命中索引。

五、字符串拼接與比較

-- MySQL
SELECT CONCAT('a', NULL, 'b');   -- NULL(任一參數為 NULL,結果為 NULL)
SELECT CONCAT('a', '', 'b');     -- 'ab'

-- SQL Server (T-SQL)
PRINT NULL + 'str';   -- NULL
PRINT '' + 'str';     -- 'str'

六、最佳實踐建議

場景推薦理由
業務「無值」語義用 NULL + IS NULL/IS NOT NULL語義清晰、聚合忽略、索引可查
業務「空值」語義(如非必填手機號)用 '' + NOT NULL DEFAULT ''避免 NULL 判斷、前端直接綁定、聚合計入
主鍵/唯一鍵NOT NULL + 自增/UUID主鍵不可 NULL,業務鍵避免 '' 衝突
時間戳創建時間TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP插入 NULL 會自動填充當前時間,插入 '' 會變零時間戳
可為 NULL 的外鍵FOREIGN KEY ... ON DELETE SET NULL利用 NULL 表示關聯斷開

七、避坑清單

  • ❌ WHERE col = NULL 永不命中 → ✅ WHERE col IS NULL
  • ❌ WHERE col != 'val' 不包含 NULL 行 → ✅ WHERE col != 'val' OR col IS NULL
  • ❌ NOT IN (subquery) 子查詢含 NULL 導致全表無結果 → ✅ NOT EXISTS 或 LEFT JOIN ... IS NULL
  • ❌ ORDER BY col DESC NULL 排在最前(MySQL 默認) → ✅ ORDER BY col IS NULL, col DESC 置後

搞清 NULL 與 '' 的語義邊界,在建表定義 NOT NULL DEFAULT '' 或 NULL、查詢用 IS NULL、聚合預期行為一致,能消除一大類隱性 Bug。

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