MySQL 中資料庫與表名在檔案系統層面對應目錄與檔案,因此大小寫敏感性本質上取決於作業系統:Windows 預設不敏感、Linux/Unix 預設敏感。lower_case_table_names 參數讓我們在引擎層統一行為,跨平台遷移時極為關鍵。
| 值 | 儲存行為 | 比較行為 | 適用場景 | 風險提示 |
|---|---|---|---|---|
| 0 | 保留 CREATE 時的大小寫 | 敏感 | Linux 原生部署、需保留大小寫語義 | 在不敏感檔案系統 (Windows/NTFS、macOS/APFS) 強制為 0 會導致 MyISAM 索引損壞 |
| 1 | 全部轉小寫儲存 | 不敏感 | Windows/macOS 預設、跨平台統一行為、異構遷移 | SHOW TABLES 只顯示小寫,無法還原原始大小寫 |
| 2 | 保留建表大小寫儲存 | 轉小寫比較 | 僅限不敏感檔案系統 (Windows/macOS) | InnoDB 強制轉小寫 (等同 1);遷移至 Linux 需確保查詢大小寫正確 |
[mysqld]
lower_case_table_names=1 # 預設即為 1,建議顯式聲明
# 如需保留大小寫語義且確認檔案系統支援:
# lower_case_table_names=2
[mysqld]
lower_case_table_names=0 # 預設 0,生產環境建議保持
# 跨平台遷移統一行為時:
# lower_case_table_names=1
# docker-compose.yml
environment:
- MYSQL_LOWER_CASE_TABLE_NAMES=1 # 統一容器內行為,避免掛載卷檔案系統差異導致問題
表名/庫名由 lower_case_table_names 控制,但欄位內容比較取決於字符集與校對規則:
_ci 結尾 (如 utf8mb4_general_ci):Case Insensitive,不區分大小寫_cs 或 _bin 結尾 (如 utf8mb4_bin):Case Sensitive / Binary,區分大小寫SHOW CREATE TABLE tbl_name\G
-- 關注 COLLATE=xxx 部分
-- 欄位預設 ci,單次查詢強制區分大小寫
SELECT * FROM users WHERE name COLLATE utf8mb4_bin = 'Admin';
-- 欄位預設 cs,單次查詢忽略大小寫
SELECT * FROM users WHERE name COLLATE utf8mb4_general_ci = 'admin';
ALTER TABLE users MODIFY name VARCHAR(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin;
SELECT TABLE_SCHEMA, TABLE_NAME FROM information_schema.TABLES WHERE TABLE_SCHEMA NOT IN ('mysql','sys','performance_schema','information_schema') AND TABLE_NAME != LOWER(TABLE_NAME); 找出含大寫的表。lower_case_table_names=1,來源端若為 0 需先將所有庫表重命名為小寫(RENAME TABLE OldName TO oldname;)。mysqldump --lower-case-table-names=1 強制導出小寫表名,或手動修改 SQL 檔。SHOW TABLES、SELECT * FROM information_schema.TABLES WHERE TABLE_NAME='target' 確認大小寫一致性。無論參數設為何值,InnoDB 內部資料字典永遠以小寫儲存表名。這意味著:
lower_case_table_names=0 於 Linux 時,MySQL 會在查詢層做大小寫映射,但 .ibd 檔案實際為小寫。lower_case_table_names=1 + 表名全小寫命名規範,彻底消除跨平台大小寫坑。