在日常資料庫開發與維護中,MySQL 的某些預設行為若不加注意,極易導致查詢結果與預期不符。本文深入探討兩大核心議題:字串比對的大小寫敏感度控制與NULL 值的正確理解與處理,助你避開常見陷阱,編寫更健壯的 SQL 語句。
預設情況下,MySQL 在執行 LIKE 等字串比對操作時不區分大小寫。例如 WHERE name LIKE 'a%' 會同時匹配以「a」或「A」開頭的記錄。若業務邏輯要求嚴格區分大小寫,可透過 COLLATE 運算符在查詢層面指定區分大小寫的校對規則:
-- 方式 1:在欄位上指定校對規則
SELECT * FROM users WHERE username COLLATE latin1_general_cs LIKE 'a%';
-- 方式 2:在比較值上指定校對規則
SELECT * FROM users WHERE username LIKE 'a%' COLLATE latin1_general_cs;
-- 方式 3:使用二進位校對規則(效能較佳)
SELECT * FROM users WHERE username COLLATE latin1_bin LIKE 'a%';
SELECT * FROM users WHERE username LIKE 'a%' COLLATE latin1_bin;
永久生效方案:若某欄位在所有查詢中都需區分大小寫,建議在建表或修改表結構時,直接為該欄位定義 CASE SENSITIVE 或 BINARY 校對規則(如 VARCHAR(50) COLLATE utf8mb4_bin),避免每次查詢都需額外指定。
補充說明:在進行 >=, >, =, <, <= 等簡單比較運算、排序或分組時,MySQL 依據字符的「內在順序值」。例如 'E'、'e'、'é' 可能擁有相同的排序權重,這在多語言環境下需特別留意。
這是最經典的誤區。兩者語義截然不同:
INSERT INTO contacts (phone) VALUES (NULL); → 表示「尚未獲取該用戶電話」,資訊缺失。INSERT INTO contacts (phone) VALUES (''); → 表示「已確認該用戶無電話號碼」,資訊明確為空。任何與 NULL 進行算術、比較或邏輯運算,結果皆為 NULL(即非 TRUE)。因此:
IS NULL / IS NOT NULL 判斷。IFNULL(col, default_val) 或 COALESCE(col, default_val) 替換顯示。WHERE col = NULL 或 WHERE col <> NULL。MyISAM、InnoDB、BDB、MEMORY 等引擎均允許被索引欄位包含 NULL,但該索引欄位必須聲明為 NOT NULL,否則無法建立索引。一旦設為 NOT NULL,該欄位便不再接受 NULL 插入。
LOAD DATA INFILE 導入時:檔案中的 NULL 會被轉為空字串 ''。DISTINCT、GROUP BY、ORDER BY:所有 NULL 視為相等值歸為一組。COUNT()、MIN()、SUM() 等):自動忽略 NULL 值。TIMESTAMP 欄位插入 NULL → 實際寫入當前時間。AUTO_INCREMENT 欄位插入 NULL → 實際寫入下一個遞增整數。掌握大小寫敏感度控制與 NULL 值語義,是編寫正確、高效 MySQL 查詢的基石。建議在資料庫設計階段即明確欄位校對規則與 NULL/NOT NULL 約束,減少後期查詢層面的額外處理,提升系統穩定性與可維護性。