萬盛學電腦網

您现在的位置: 萬盛學電腦網 >> 程式設計 >  >> 資料庫 >> MySQL 教學

MySQL 大小寫敏感性完整指南:校對規則、配置與避坑

預設行為:不區分大小寫 (預設校對規則)

MySQL 預設校對規則 (如 utf8mb4_general_ci、latin1_swedish_ci) 尾碼 _ci 代表 Case Insensitive。查詢 WHERE name LIKE 'a%' 會匹配 'Apple'、'apple'、'Ápple'。

啟用大小寫敏感的三種方式

1. 列級別:建表指定 _cs 或 _bin 校對

CREATE TABLE t (
  name VARCHAR(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin, -- 二進制比較,嚴格區分大小寫、重音
  code VARCHAR(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_cs -- 區分大小寫,不區分重音
) DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;

2. 查詢級別:COLLATE 子句臨時指定

SELECT * FROM t WHERE name COLLATE utf8mb4_bin = 'Apple';
SELECT * FROM t WHERE name LIKE 'a%' COLLATE utf8mb4_general_cs;

3. 伺服器/資料庫/表級別預設

[mysqld]
character-set-server = utf8mb4
collation-server = utf8mb4_bin  -- 全域預設區分大小寫

-- 或資料庫級別
CREATE DATABASE db_name CHARACTER SET utf8mb4 COLLATE utf8mb4_bin;

校對規則選型對照表

校對規則大小寫重音/變音速度適用語言
utf8mb4_general_ci不敏感不敏感快通用、多語言混雜
utf8mb4_unicode_ci不敏感敏感 (UCA 標準)稍慢需正確排序的多語言
utf8mb4_bin敏感敏感 (二進制)最快精確匹配、Base64、Hash、大小寫敏感業務
utf8mb4_general_cs敏感不敏感中僅需大小寫敏感
utf8mb4_0900_ai_ci不敏感不敏感快MySQL 8.0 預設,Unicode 9.0 標準
utf8mb4_0900_as_cs敏感敏感中8.0 精確匹配推薦

常見陷阱

  1. 唯一索引衝突:utf8mb4_general_ci 下 'a' 與 'A' 視為重複,INSERT 會報 Duplicate entry
  2. JOIN/子查詢不匹配:兩表校對規則不同導致隱式轉換、索引失效、結果錯誤
  3. 應用層與資料庫不一致:Java String.equals 區分大小寫,DB 不區分,邏輯判斷出現分歧
  4. 備份還原校對遺失:mysqldump 不含校對資訊時,還原到預設 _ci 庫導致行為改變

最佳實踐

  • 新專案:資料庫級別 utf8mb4_0900_ai_ci (8.0) / utf8mb4_unicode_ci (5.7),業務需大小寫敏感的欄位單獨指定 _bin 或 _cs
  • 舊專案遷移:pt-online-schema-change 逐表修改校對規則,驗證應用相容性
  • 連線字串顯式設定:connectionCollation=utf8mb4_bin (JDBC) / charset=utf8mb4 (PDO) 避免隱式轉換
  • 測試用例覆蓋大小寫邊界:'a' vs 'A', 'ß' vs 'ss', 'ı' vs 'I' (土耳其語)
copyright © 萬盛學電腦網 all rights reserved