在跨平台遷移或開發環境與生產環境作業系統不一致(如 Windows 開發、Linux 部署)的情況下,MySQL 資料庫與資料表名稱的大小寫敏感度差異常導致「找不到資料表」或「資料表已存在」等錯誤。本文詳細說明 lower_case_table_names 參數的運作機制,並提供與 SQL Server 行為一致的配置建議。
該參數控制 MySQL 如何處理識別符(資料庫名、資料表名)的大小寫:
MyTable 與 mytable 是兩張不同的表。mysql> USE mytest;
mysql> CREATE TABLE MyTable (id INT, name VARCHAR(10));
mysql> CREATE TABLE mytable (id INT, name VARCHAR(10));
mysql> SHOW TABLES;
+------------------+
| Tables_in_mytest |
+------------------+
| MyTable |
| mytable |
+------------------+
結果:可同時建立 MyTable 和 mytable 兩張表,大小寫嚴格區分。
/etc/my.cnf,在 [mysqld] 區段新增:lower_case_table_names = 1systemctl restart mysqldmysql> USE mytest;
mysql> SELECT * FROM MyTable;
mysql> SELECT * FROM mytable;
-- 兩條查詢結果相同,皆查詢 mytable 表
mysql> CREATE TABLE MyTable (id INT);
ERROR 1050 (42S01): Table 'mytable' already exists
mysql> CREATE DATABASE MyTest;
ERROR 1007 (HY000): Can't create database 'mytest'; database exists
結果:資料庫與資料表名稱全部轉為小寫儲存,查詢完全不區分大小寫,完美模擬 SQL Server 行為。
警告: 在 Unix/Linux 系統上將
lower_case_table_names從 0 改為 1 並重啟前,必須先手動將現有所有資料庫與資料表名稱轉為小寫。否則重啟後,MySQL 會嘗試以小寫名稱尋找檔案,導致原本大寫或混合大小寫的資料表「消失」(實際檔案仍在,但 MySQL 找不到)。
可使用 RENAME TABLE 或腳本批次重命名現有物件為小寫後再修改參數重啟。
為了開發、測試、生產環境一致性,以及與 SQL Server 遷移相容,強烈建議在 Linux 生產環境啟動 MySQL 前,於 my.cnf 設定 lower_case_table_names = 1。若為既有系統遷移,務必先完成識別符小寫轉換工作。