MySQL 9.0 參考手冊  /  ...  /  識別符號大小寫敏感度

11.2.3 識別符號大小寫敏感度

在 MySQL 中,資料庫對應到資料目錄中的目錄。資料庫中的每個資料表對應到資料庫目錄中的至少一個檔案(也可能更多,取決於儲存引擎)。觸發程序也對應到檔案。因此,底層作業系統的大小寫敏感度在資料庫、資料表和觸發程序名稱的大小寫敏感度中扮演一個角色。這表示這些名稱在 Windows 中不區分大小寫,但在大多數 Unix 變體中區分大小寫。一個值得注意的例外是 macOS,它基於 Unix,但使用預設不區分大小寫的檔案系統類型 (HFS+)。然而,macOS 也支援 UFS 磁碟區,它與任何 Unix 上一樣區分大小寫。請參閱第 1.7.1 節,「MySQL 對標準 SQL 的擴充」lower_case_table_names 系統變數也會影響伺服器處理識別符號大小寫敏感度的方式,如本節稍後所述。

注意

雖然資料庫、資料表和觸發程序名稱在某些平台上不區分大小寫,但您不應在同一個陳述式中使用不同的大小寫來參考其中一個。以下陳述式將無法運作,因為它將資料表同時稱為 my_tableMY_TABLE

mysql> SELECT * FROM my_table WHERE MY_TABLE.col=1;

分割區、子分割區、欄、索引、儲存程序、事件和資源群組名稱在任何平台上都不區分大小寫,欄別名也不區分大小寫。

但是,記錄檔群組的名稱區分大小寫。這與標準 SQL 不同。

依預設,資料表別名在 Unix 上區分大小寫,但在 Windows 或 macOS 上則不區分大小寫。以下陳述式在 Unix 上將無法運作,因為它將別名同時稱為 aA

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 TABLECREATE DATABASE 陳述式中指定的大小寫字母儲存。名稱比較區分大小寫。如果您在具有不區分大小寫檔案名稱的系統(例如 Windows 或 macOS)上執行 MySQL,則應將此變數設定為 0。如果您在不區分大小寫的檔案系統上使用 --lower-case-table-names=0 強制將此變數設為 0,並使用不同的大小寫字母存取 MyISAM 資料表名稱,則可能會導致索引損毀。
1 資料表名稱在磁碟上以小寫字母儲存,且名稱比較不區分大小寫。MySQL 會在儲存和查詢時將所有資料表名稱轉換為小寫。此行為也適用於資料庫名稱和資料表別名。
2 資料表和資料庫名稱在磁碟上使用 CREATE TABLECREATE DATABASE 陳述式中指定的大小寫字母儲存,但 MySQL 會在查詢時將它們轉換為小寫。名稱比較不區分大小寫。這適用於不區分大小寫的檔案系統!InnoDB 資料表名稱和檢視名稱會以小寫儲存,與 lower_case_table_names=1 相同。

如果您只在一個平台上使用 MySQL,通常不需要使用預設以外的 lower_case_table_names 設定。但是,如果您想在檔案系統大小寫敏感度不同的平台之間傳輸資料表,則可能會遇到困難。例如,在 Unix 上,您可以使用兩個不同的資料表,分別命名為 my_tableMY_TABLE,但在 Windows 上,這兩個名稱會被視為相同。為了避免因資料庫或資料表名稱的大小寫字母而產生的資料傳輸問題,您有兩個選項

  • 在所有系統上使用 lower_case_table_names=1。這樣做的主要缺點是,當您使用 SHOW TABLESSHOW 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 搜尋中使用校對」