首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

MySQL 表名不區分大小寫設定:lower_case_table_names 完整指南

     編輯:MySQL 資料庫相關知識

問題根源

Linux 下 MySQL 預設區分表名大小寫(lower_case_table_names=0),Windows 預設不區分(=1)。跨平台遷移、開發環境不一致常導致「表找不到」、「建表報錯」等問題。

參數值含義

值行為適用 OS
0儲存按原大小寫,比較區分大小寫Linux/Unix 預設
1儲存統一轉小寫,比較不區分大小寫Windows/macOS 預設
2儲存按原大小寫,比較轉小寫後比較極少用,不推薦

設定步驟(Linux 設為不區分)

  1. 停止 MySQL:systemctl stop mysqld
  2. 備份資料:mysqldump --all-databases > backup.sql(建議)
  3. 編輯配置:vim /etc/my.cnf,在 [mysqld] 區段加入:
[mysqld]
lower_case_table_names = 1
  1. 刪除/遷移舊資料目錄:因檔案系統大小寫敏感,舊表檔案大小寫可能不一致,建議重新初始化或從備份恢復。
  2. 啟動 MySQL:systemctl start mysqld
  3. 驗證:SHOW VARIABLES LIKE 'lower_case_table_names'; → 1

遷移現有資料庫的完整流程

# 1. 導出(表名會自動轉小寫)
mysqldump -u root -p --all-databases > all.sql

# 2. 停止服務、修改配置、清空/備份資料目錄
systemctl stop mysqld
# 編輯 my.cnf 加入 lower_case_table_names=1
mv /var/lib/mysql /var/lib/mysql.bak
mkdir /var/lib/mysql && chown mysql:mysql /var/lib/mysql

# 3. 初始化系統表(MySQL 5.7+)
mysqld --initialize-insecure --user=mysql
# 或 8.0+
mysqld --initialize-insecure --user=mysql --datadir=/var/lib/mysql

# 4. 啟動、導入
systemctl start mysqld
mysql -u root -p < all.sql

應用層最佳實踐

  • 代碼中統一使用小寫表名:無論參數值為何,SQL 寫小寫永無兼容問題。
  • ORM/框架配置:Laravel 'prefix' => ''、Hibernate hibernate.identifier_generator_strategy 等確保生成小寫。
  • 遷移腳本:Flyway/Liquibase 變更集表名寫小寫。

常見誤區

以為只改參數即可
現有表檔案大小寫不變,InnoDB 系統表仍記錄原大小寫,會導致「表不存在」錯誤。必須重新導入。
以為 2 是折中方案
=2 會在檔案系統保留大小寫,但比較時轉小寫,極易在備份/遷移/複製時出現不一致,官方不推薦生產使用。

結語

lower_case_table_names 是 MySQL 跨平台相容性的核心開關。統一設為 1(小寫存儲、不區分比較)並在代碼層強制小寫,是避免大小寫地獄的最佳策略。變更此參數屬於重大遷移,務必完整備份、驗證、在維護窗口執行。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved