MySQL 識別符 (庫/表/欄位/別名/變量) 大小寫敏感性由作業系統檔案系統與配置參數 lower_case_table_names 共同決定,Linux 區分、Windows 不區分,跨平台遷移極易踩坑。
| 識別符類型 | Linux (預設) | Windows (預設) | macOS (預設) |
|---|---|---|---|
| 資料庫名 / 表名 | 嚴格區分 | 不區分 | 不區分 (APFS 不區分) |
| 表別名 | 嚴格區分 | 不區分 | 不區分 |
| 變量名 (用戶/系統) | 嚴格區分 | 區分 | 區分 |
| 欄位名 / 列別名 | 不區分 | 不區分 | 不區分 |
| 字符串比較 (非二進位) | 依排序規則 | 依排序規則 | 依排序規則 |
utf8_general_ci 等 _ci (Case Insensitive) 排序規則,故不區分大小寫。latin1/ISO-8859 不區分大小寫,影響早期版本行為。| 值 | 儲存方式 | 比較方式 | 適用場景 |
|---|---|---|---|
| 0 (Linux 預設) | 按給定大小寫儲存 | 區分大小寫 | 生產環境 Linux,嚴格區分 |
| 1 (Windows/macOS 預設) | 轉小寫儲存 | 不區分大小寫 | 跨平台開發、Windows 部署 |
| 2 | 按給定大小寫儲存 | 轉小寫比較 | 罕用,儲存保留、查詢不區分 |
⚠️ 關鍵限制: lower_case_table_names 只能在 初始化資料目錄前 設定 (mysqld --initialize 前),運行中修改需重新初始化 (相當於重裝),生產環境極其謹慎。
-- Linux 環境
CREATE DATABASE swxx_zxwd;
CREATE DATABASE SWXX_ZXWD; -- 成功建立兩個不同庫!
SELECT * FROM swxx_zxwd.table1; -- 查庫1
SELECT * FROM SWXX_ZXWD.table1; -- 查庫2,結果完全不同!
手抖建立同名不同大小寫庫/表,SQL 查詢時大小寫決定訪問哪個對象,極易導致資料不一致、應用邏輯錯亂。
my.ini [mysqld] 加 lower_case_table_names=1,模擬生產不區分行為,避免開發期建立大小寫差異對象。BINARY 屬性或用 VARBINARY 類型,或查詢時 WHERE BINARY col = 'Abc'。INFORMATION_SCHEMA 發現大小寫衝突:
SELECT TABLE_SCHEMA, TABLE_NAME, COUNT(*)
FROM INFORMATION_SCHEMA.TABLES
GROUP BY LOWER(TABLE_SCHEMA), LOWER(TABLE_NAME)
HAVING COUNT(*) > 1;
_ci (Case Insensitive):'A' = 'a',預設如 utf8_general_ci、utf8mb4_0900_ai_ci_cs (Case Sensitive):'A' != 'a',如 utf8_bin、utf8mb4_0900_as_cs_bin:二進位比較,最快、嚴格區分大小寫、不支援多語言排序規則查詢欄位排序規則:SHOW FULL COLUMNS FROM tbl; 或 SELECT COLLATION_NAME FROM INFORMATION_SCHEMA.COLUMNS ...
大小寫敏感性是跨平台 MySQL 部署的「隱形殺手」,統一小寫命名規範 + 環境參數對齊 + 遷移前掃描,三重保險消除風險。