萬盛學電腦網

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

MySQL 數據庫/表名大小寫敏感性深度解析:lower_case_table_names 參數與跨平台遷移避坑

核心機制

MySQL 將數據庫/表映射為文件系統目錄/文件,因此大小寫敏感性取決於底層 OS 文件系統:

作業系統文件系統大小寫敏感
WindowsNTFS/FAT32不敏感
Linux/Unixext4/xfs敏感
macOSHFS+ (默認)不敏感
macOSUFS/APFS (區分大小寫)敏感

lower_case_table_names 參數詳解

值行為適用場景
0按給定大小寫存儲,比較敏感Linux 生產默認
1存儲/比較全部轉小寫Windows 默認、跨平台遷移推薦
2按給定大小寫存儲,比較轉小寫極少用

關鍵限制與陷阱

  1. 同一查詢中大小寫必須一致:
    -- 錯誤:my_table vs MY_TABLE
    SELECT * FROM my_table WHERE MY_TABLE.col = 1;
    
  2. 列名/別名不區分大小寫(所有平台)
  3. 表別名區分大小寫:
    -- 錯誤:a vs A
    SELECT col FROM tbl AS a WHERE a.col=1 OR A.col=2;
    
  4. 修改參數需重建表:改 lower_case_table_names 後,舊表名未自動轉小寫,需 RENAME TABLE 手動轉換

跨平台遷移最佳實踐

  1. 統一命名規範:全部小寫 + 下劃線(user_order_detail)
  2. 目標庫設置 lower_case_table_names=1:
    • Linux:my.cnf [mysqld] lower_case_table_names=1 → 重啟 → 重建表
    • Windows:默認即為 1
  3. 遷移工具:mysqldump --lower-case-table-names=1 導出時強制小寫
  4. 驗證腳本:
    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
copyright © 萬盛學電腦網 all rights reserved