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

MySQL 資料庫與資料表名稱大小寫敏感度設定與 SQL Server 相容性配置指南

     編輯:MySQL 資料庫相關知識

前言

在跨平台遷移或開發環境與生產環境作業系統不一致(如 Windows 開發、Linux 部署)的情況下,MySQL 資料庫與資料表名稱的大小寫敏感度差異常導致「找不到資料表」或「資料表已存在」等錯誤。本文詳細說明 lower_case_table_names 參數的運作機制,並提供與 SQL Server 行為一致的配置建議。

核心參數:lower_case_table_names

該參數控制 MySQL 如何處理識別符(資料庫名、資料表名)的大小寫:

  • 0(Linux/Unix 預設):大小寫敏感。MyTable 與 mytable 是兩張不同的表。
  • 1(Windows 預設,建議跨平台統一用此值):大小寫不敏感。所有名稱儲存為小寫,查詢時不區分大小寫,行為類似 SQL Server。
  • 2:儲存時保留大小寫,但查詢時轉為小寫比對(僅限不區分大小寫的檔案系統)。

實驗驗證:預設值 (0) vs 設定值 (1)

情況一:lower_case_table_names = 0 (Linux 預設)

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 兩張表,大小寫嚴格區分。

情況二:lower_case_table_names = 1 (建議配置)

  1. 編輯設定檔 /etc/my.cnf,在 [mysqld] 區段新增:
    lower_case_table_names = 1
  2. 重啟 MySQL 服務:systemctl restart mysqld
  3. 驗證行為:
mysql> 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。若為既有系統遷移,務必先完成識別符小寫轉換工作。

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