在 MySQL 中,資料庫對應到資料目錄中的目錄。資料庫中的每個資料表至少對應到資料庫目錄中的一個檔案(而且可能更多,取決於儲存引擎)。觸發程序也對應到檔案。因此,底層作業系統的大小寫敏感度在資料庫、資料表和觸發程序名稱的大小寫敏感度中扮演一部分角色。這表示這些名稱在 Windows 中不區分大小寫,但在大多數的 Unix 變體中區分大小寫。一個值得注意的例外是 macOS,它是基於 Unix 的,但使用預設的不區分大小寫的檔案系統類型 (HFS+)。然而,macOS 也支援 UFS 磁碟區,它們與任何 Unix 一樣區分大小寫。請參閱章節 1.7.1,「MySQL 對標準 SQL 的擴充」。lower_case_table_names
系統變數也會影響伺服器如何處理識別符號的大小寫敏感度,詳情請見本章節後面的說明。
雖然資料庫、資料表和觸發程序名稱在某些平台上不區分大小寫,但您不應在同一個陳述式中以不同的大小寫來參照這些名稱。以下陳述式無法運作,因為它將資料表同時參照為 my_table
和 MY_TABLE
mysql> SELECT * FROM my_table WHERE MY_TABLE.col=1;
分割區、子分割區、欄、索引、儲存的常式、事件和資源群組名稱在任何平台上都不區分大小寫,欄別名也不區分大小寫。
然而,記錄檔群組的名稱區分大小寫。這與標準 SQL 不同。
依預設,資料表別名在 Unix 上區分大小寫,但在 Windows 或 macOS 上則不區分。以下陳述式在 Unix 上無法運作,因為它將別名同時參照為 a
和 A
mysql> SELECT col_name FROM tbl_name AS a
WHERE a.col_name = 1 OR A.col_name = 2;
然而,相同的陳述式在 Windows 上是允許的。為了避免因這類差異而造成的問題,最好採用一致的慣例,例如永遠使用小寫名稱來建立和參照資料庫和資料表。建議使用此慣例以獲得最大的可攜性和易用性。
資料表和資料庫名稱如何儲存在磁碟上以及如何在 MySQL 中使用,會受到 lower_case_table_names
系統變數的影響。lower_case_table_names
可以採用下表所示的值。此變數不影響觸發程序識別符號的大小寫敏感度。在 Unix 上,lower_case_table_names
的預設值為 0。在 Windows 上,預設值為 1。在 macOS 上,預設值為 2。
lower_case_table_names
只能在初始化伺服器時設定。禁止在伺服器初始化後變更 lower_case_table_names
設定。
值 | 意義 |
---|---|
0 |
資料表和資料庫名稱使用 CREATE TABLE 或 CREATE DATABASE 陳述式中指定的大小寫,儲存在磁碟上。名稱比較區分大小寫。如果您在具有不區分大小寫的檔案名稱的系統(例如 Windows 或 macOS)上執行 MySQL,則不應將此變數設為 0。如果您在不區分大小寫的檔案系統上使用 --lower-case-table-names=0 強制此變數為 0,並使用不同的大小寫來存取 MyISAM 資料表名稱,則可能會導致索引損毀。 |
1 |
資料表名稱以小寫形式儲存在磁碟上,且名稱比較不區分大小寫。MySQL 在儲存和查詢時,會將所有資料表名稱轉換為小寫。此行為也適用於資料庫名稱和資料表別名。 |
2 |
資料表和資料庫名稱使用 CREATE TABLE 或 CREATE DATABASE 陳述式中指定的大小寫,儲存在磁碟上,但 MySQL 在查詢時會將它們轉換為小寫。名稱比較不區分大小寫。這僅適用於不區分大小寫的檔案系統!InnoDB 資料表名稱和檢視名稱會以小寫形式儲存,與 lower_case_table_names=1 相同。 |
如果您僅在一個平台上使用 MySQL,則通常不需要使用預設值以外的 lower_case_table_names
設定。然而,如果您想要在檔案系統大小寫敏感度不同的平台之間傳輸資料表,可能會遇到困難。例如,在 Unix 上,您可以有兩個不同的資料表,分別名為 my_table
和 MY_TABLE
,但在 Windows 上,這兩個名稱被視為相同。為了避免因資料庫或資料表名稱的大小寫而導致的資料傳輸問題,您有兩個選項
在所有系統上使用
lower_case_table_names=1
。這樣做主要缺點是,當您使用SHOW TABLES
或SHOW DATABASES
時,您看不到原始大小寫的名稱。在 Unix 上使用
lower_case_table_names=0
,在 Windows 上使用lower_case_table_names=2
。這樣做會保留資料庫和資料表名稱的大小寫。這樣做的缺點是,您必須確保您的陳述式在 Windows 上總是使用正確的大小寫來參照您的資料庫和資料表名稱。如果您將您的陳述式傳輸到大小寫有意義的 Unix,則如果大小寫不正確,它們將無法運作。例外:如果您使用的是
InnoDB
資料表,並且您嘗試避免這些資料傳輸問題,則您應該在所有平台上使用lower_case_table_names=1
,以強制將名稱轉換為小寫。
如果物件名稱的全部大寫形式根據二進位排序規則相等,則物件名稱可能會被視為重複。這對於游標、條件、程序、函式、儲存點、儲存常式參數、儲存程式本機變數和外掛程式的名稱為真。這不適用於欄、約束、資料庫、分割區、使用 PREPARE
準備的陳述式、資料表、觸發程序、使用者和使用者定義變數的名稱。
檔案系統的大小寫敏感性可能會影響在 INFORMATION_SCHEMA
資料表的字串欄位中的搜尋。如需詳細資訊,請參閱第 12.8.7 節,「在 INFORMATION_SCHEMA 搜尋中使用定序」。