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

MySQL 空值(NULL)與空字符串('')區別深度解析及刪除策略

     編輯:MySQL 資料庫相關知識

MySQL 中 NULL (無值) 與 '' (空字符串,長度 0) 是**完全不同**的兩個概念。混淆二者會導致查詢條件失效、統計錯誤、索引異常。本文從存儲本質、運算行為、判斷語法、刪除策略四個維度徹底釐清,附實測驗證。

一、本質區別:存儲與語義

特性NULL空字符串 ('')
語義值不存在、未知、不適用值存在、長度為 0 的字符串
物理存儲不佔用數據頁空間 (僅在 NULL 位圖標記 1 bit)佔用 1-2 字節 (長度前綴 + 0 字符)
字符串結束符無含隱式 \0 結束符
NOT NULL 約束禁止插入 NULL允許插入 ''
自增/默認值填充插入 NULL 觸發自增/默認值插入 '' 不觸發,實際存 ''

二、運算與比較行為差異

1. 算術/字符串運算

SELECT 1 + NULL;        -- NULL (任何與 NULL 運算結果為 NULL)
SELECT CONCAT('a', NULL); -- NULL
SELECT 1 + '';          -- 1 (空串隱式轉為 0)
SELECT CONCAT('a', '');   -- 'a'

2. 比較運算符

SELECT NULL = NULL;       -- NULL (未知),非 TRUE
SELECT NULL <> NULL;      -- NULL
SELECT NULL <=> NULL;     -- 1 (MySQL 專用 NULL 安全等值)
SELECT '' = '';           -- 1 (TRUE)
SELECT '' <> '';          -- 0 (FALSE)

3. 邏輯判斷

SELECT IF(NULL, 'T', 'F');    -- 'F' (NULL 視為 FALSE)
SELECT IF('', 'T', 'F');      -- 'F' (空串視為 FALSE)
SELECT IF('x', 'T', 'F');     -- 'T'

三、正確判斷語法

目的正確語法錯誤語法
判斷是否為 NULLcol IS NULL / col IS NOT NULLcol = NULL / col != NULL
判斷是否為空串col = '' / col <> '' / LENGTH(col) = 0col IS NULL
NULL 安全等值col <=> valcol = val (val 為 NULL 時失效)
空值轉默認 (SQL層)IFNULL(col, 'default') / COALESCE(col, 'default')應用層遍歷
空串轉默認 (SQL層)IF(col='', 'default', col) / NULLIF(col, '') 配合 COALESCE-

四、刪除策略:精準匹配

1. 刪除 NULL 值行

DELETE FROM tbl WHERE col IS NULL;
-- 或批量多列
DELETE FROM tbl WHERE col1 IS NULL OR col2 IS NULL;

2. 刪除空字符串行

DELETE FROM tbl WHERE col = '';
-- 或 TRIM 後為空 (含空白字符)
DELETE FROM tbl WHERE TRIM(col) = '';

3. 刪除「NULL 或 空串」 (視為同義業務)

DELETE FROM tbl WHERE col IS NULL OR col = '';
-- 簡寫 (利用 IFNULL/COALESCE)
DELETE FROM tbl WHERE IFNULL(col, '') = '';
-- 或
DELETE FROM tbl WHERE COALESCE(col, '') = '';

五、LEFT JOIN 產生 NULL 的經典場景

Table A: id, name    Table B: id, address
1, 'Alice'            1, 'Shanghai'
2, 'Bob'              3, 'Beijing'

SELECT A.id, A.name, B.address
FROM A LEFT JOIN B ON A.id = B.id;
-- 結果:
-- 1, 'Alice', 'Shanghai'
-- 2, 'Bob', NULL   -- B 中無 id=2,address 為 NULL (非空串)

SELECT A.id, A.name, B.address
FROM A RIGHT JOIN B ON A.id = B.id;
-- 結果:
-- 1, 'Alice', 'Shanghai'
-- 3, NULL, 'Beijing'  -- A 中無 id=3,name 為 NULL

這是 NULL 產生的**根本来源**:外連接無匹配行時的填充值,非人為插入。

六、總結口訣

NULL 無值佔位圖、空串有值長度零;運算比較 NULL 致 NULL、空串正常參與;IS NULL 判空值、等空串判空串;刪除精準分兩類、業務合一用 COALESCE;LEFT JOIN 產生 NULL、外連接本質記心頭。

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