MySQL 的識別符(表名、列名)大小寫敏感性取決於作業系統與 lower_case_table_names 系統變量;數據比較、排序的大小寫敏感性則由校對規則 決定。本文梳理兩套機制,給出生產環境配置建議。
| 值 | 行為 | 適用作業系統 | 說明 |
|---|---|---|---|
| 0 | **區分大小寫** | Linux/Unix (預設) | 表名按建表時大小寫存儲,查詢需精確匹配大小寫 |
| 1 | **不區分大小寫** | Windows (預設)、macOS (HFS+) | 表名存儲為小寫,查詢自動轉小寫匹配 |
| 2 | **存儲保留大小寫,比較不區分** | macOS (APFS) 等 | 建表保留大小寫,但查詢按小寫比較 |
mysqld --initialize 前),運行時不可動態修改。# my.cnf / my.ini [mysqld] lower_case_table_names=1
修改後需重新初始化數據目錄(rm -rf datadir; mysqld --initialize),務必先備份數據。
校對規則決定字符集下的比較、排序規則,命名規則:<charset>_<lang>_<ci/cs/bin>。
| 後綴 | 含義 | 大小寫敏感 | 典型例子 |
|---|---|---|---|
| _ci | Case Insensitive | 不敏感 | utf8mb4_general_ci、utf8mb4_0900_ai_ci |
| _cs | Case Sensitive | 敏感 | utf8mb4_general_cs、utf8mb4_0900_as_cs |
| _bin | Binary | 敏感(按字節碼比較) | utf8mb4_bin、latin1_bin |
-- 服務級默認 character-set-server=utf8mb4 collation-server=utf8mb4_0900_ai_ci -- 庫級覆蓋 CREATE DATABASE db1 CHARACTER SET utf8mb4 COLLATE utf8mb4_bin; -- 表級覆蓋 CREATE TABLE t1 (c1 VARCHAR(10)) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci; -- 列級覆蓋(最高優先級) CREATE TABLE t2 (c1 VARCHAR(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin);
utf8mb4_general_ci 或 utf8mb4_0900_ai_ci,唯一索引自動合併 'Admin'/'admin'。utf8mb4_bin 或 utf8mb4_general_cs。_cs 或 _bin;_ci 下 'a'='A' 排序不穩定。COLLATE utf8mb4_bin。mysqldump 導出含 COLLATE 子句,導入目標庫若無該校對規則會報錯。解決:目標庫預先創建同字符集/校對規則,或導入前 sed 替換。utf8mb4_0900_ai_ci:支援 Unicode 9.0、重音不敏感(ai)、大小寫不敏感(ci)。升級 5.7→8.0 時注意排序結果變化。**識別符大小寫靠 lower_case_table_names(啟動時固化),數據大小寫靠 COLLATE(可列級精細控制)**。生產環境建議:lower_case_table_names=1 + 默認 utf8mb4_0900_ai_ci,業務需區分大小寫的列顯式指定 COLLATE utf8mb4_bin。統一規範,杜絕「開發環境 Windows 正常、生產 Linux 報錯」的跨平台大小寫地雷。