核心機制
MySQL 將數據庫/表映射為文件系統目錄/文件,因此大小寫敏感性取決於底層 OS 文件系統:
| 作業系統 | 文件系統 | 大小寫敏感 |
| Windows | NTFS/FAT32 | 不敏感 |
| Linux/Unix | ext4/xfs | 敏感 |
| macOS | HFS+ (默認) | 不敏感 |
| macOS | UFS/APFS (區分大小寫) | 敏感 |
lower_case_table_names 參數詳解
| 值 | 行為 | 適用場景 |
| 0 | 按給定大小寫存儲,比較敏感 | Linux 生產默認 |
| 1 | 存儲/比較全部轉小寫 | Windows 默認、跨平台遷移推薦 |
| 2 | 按給定大小寫存儲,比較轉小寫 | 極少用 |
關鍵限制與陷阱
- 同一查詢中大小寫必須一致:
-- 錯誤:my_table vs MY_TABLE
SELECT * FROM my_table WHERE MY_TABLE.col = 1;
- 列名/別名不區分大小寫(所有平台)
- 表別名區分大小寫:
-- 錯誤:a vs A
SELECT col FROM tbl AS a WHERE a.col=1 OR A.col=2;
- 修改參數需重建表:改
lower_case_table_names 後,舊表名未自動轉小寫,需 RENAME TABLE 手動轉換
跨平台遷移最佳實踐
- 統一命名規範:全部小寫 + 下劃線(
user_order_detail)
- 目標庫設置
lower_case_table_names=1:
- Linux:
my.cnf [mysqld] lower_case_table_names=1 → 重啟 → 重建表
- Windows:默認即為 1
- 遷移工具:
mysqldump --lower-case-table-names=1 導出時強制小寫
- 驗證腳本:
SELECT TABLE_SCHEMA, TABLE_NAME
FROM information_schema.TABLES
WHERE TABLE_SCHEMA NOT IN ('mysql','sys','performance_schema','information_schema')
AND (TABLE_SCHEMA != LOWER(TABLE_SCHEMA) OR TABLE_NAME != LOWER(TABLE_NAME));
-- 有結果說明存在大寫,需重命名
啟動參數修改示例
# 方法 1:命令行臨時(不持久)
./mysqld_safe --lower_case_table_names=1 &
# 方法 2:配置文件永久
# /etc/my.cnf
[mysqld]
lower_case_table_names=1