整理網站資料時,畫面看起來都是空白,MySQL查詢卻只找出其中一部分。常見原因是同一欄位裡混了NULL與空字串;還有人把0當成沒填,讓原本有效的值一起消失。
先查資料,不要直接把所有空值改成0
NULL表示缺少值或值未知;空字串是已存在、長度為0的文字。下面用字串欄位的三個值作比較,不會新增或修改你的資料表:
SELECT val,
val IS NULL AS is_null,
val = '' AS is_empty,
val = '0' AS is_zero
FROM (
SELECT CAST(NULL AS CHAR) AS val
UNION ALL SELECT ''
UNION ALL SELECT '0'
) AS sample;
第一列只有IS NULL為1,兩個等號比較的結果都是NULL;第二列只有空字串比較為1;第三列只有文字’0’的比較為1。本例刻意使用字串型別,不把文字’0’和數字0的型別轉換混在一起。
查缺值用IS NULL,不用等號
WHERE val = NULL不會找出第一列,因為和NULL作一般比較不會得到true。要找缺值,用IS NULL;要找空字串,則用等號比對空字串:
-- 把custom_field換成你的實際欄位
WHERE custom_field IS NULL
-- 只找已儲存的空字串
WHERE custom_field = ''
-- 需求確實把兩種都視為未填時
WHERE custom_field IS NULL OR custom_field = ''
先用SELECT查看符合條件的資料,再決定是否清理。不要直接對整張正式資料表UPDATE;備份與轉換規則要先確定,尤其是金額、庫存或排序欄位,0可能有明確意義。
COUNT欄位與COUNT星號也不同
對上述三列,COUNT(*)是3,COUNT(val)是2。後者不計NULL,但會計入空字串和文字’0’。所以「有兩筆值」不等於「有兩筆填好內容」。做網站欄位完成度或資料匯出統計時,先定義哪些狀態才算已填,再寫條件。
若前端每次都把空白送成不同形式,單靠查詢補救會越來越亂。確認欄位能否為NULL、預設值與儲存程式如何處理空輸入,讓新增資料有一致的含義。
參考資料
資料核對於2026年10月3日;範例與文件可能更新。
原文鏈接:https://wntheme.com/mysql-null-empty-string-zero/,轉載請註明出處。

評論0