首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> MySQL 資料庫 >> MySQL 綜合教學

MySQL 大小寫敏感完整配置指南:跨平台遷移零風險

     編輯:MySQL 綜合教學

核心參數:lower_case_table_names 決定一切

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 需確保查詢大小寫正確

各平台配置最佳實踐

Windows (my.ini)

[mysqld]
lower_case_table_names=1  # 預設即為 1,建議顯式聲明
# 如需保留大小寫語義且確認檔案系統支援:
# lower_case_table_names=2

Linux (my.cnf)

[mysqld]
lower_case_table_names=0  # 預設 0,生產環境建議保持
# 跨平台遷移統一行為時:
# lower_case_table_names=1

Docker/容器化部署

# docker-compose.yml
environment:
  - MYSQL_LOWER_CASE_TABLE_NAMES=1  # 統一容器內行為,避免掛載卷檔案系統差異導致問題

列級大小寫敏感:校對規則 (Collation) 控制

表名/庫名由 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;

跨平台遷移避坑清單

  1. 遷移前審計: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); 找出含大寫的表。
  2. 統一參數:目標端設定 lower_case_table_names=1,來源端若為 0 需先將所有庫表重命名為小寫(RENAME TABLE OldName TO oldname;)。
  3. 導出導入:使用 mysqldump --lower-case-table-names=1 強制導出小寫表名,或手動修改 SQL 檔。
  4. 驗證:遷移後執行 SHOW TABLES、SELECT * FROM information_schema.TABLES WHERE TABLE_NAME='target' 確認大小寫一致性。

InnoDB 特殊限制

無論參數設為何值,InnoDB 內部資料字典永遠以小寫儲存表名。這意味著:

  • lower_case_table_names=0 於 Linux 時,MySQL 會在查詢層做大小寫映射,但 .ibd 檔案實際為小寫。
  • 直接複製 .ibd 檔案做 TSP (Tablespace Transport) 時,目標端表名必須小寫匹配。

總結建議

  • 新專案:統一使用 lower_case_table_names=1 + 表名全小寫命名規範,彻底消除跨平台大小寫坑。
  • 既有 Linux 專案:維持 0,但嚴格執行「庫表全小寫」編碼規範,避免手寫 SQL 出現大寫。
  • Windows 開發、Linux 生產:開發端設 1,生產端設 0,CI/CD 流程中加入大小寫檢查腳本。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved