默認情況下,表別名在Unix上區分大小寫,但在Windows或macOS上不是這樣。以下語句在Unix上不起作用,因為它引用別名as a和as 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 系統變量的影響,您可以在啟動 mysqld 時設置該 變量 。 lower_case_table_names 可以采用下表中顯示的值。這個變量不不影響觸發標識符的情況下的靈敏度。在Unix上,默認值為 lower_case_table_names 為 0 ,在 Windows 上,默認值為 1,在 macOS 上,默認值為 2 。
| 值 | 含義 |
|---|---|
| 0 | 表和數據庫名稱使用CREATE TABLEor CREATE DATABASE語句中指定的lettercase存儲在磁盤上。名稱比較區分大小寫。你應該不會,如果你有不區分大小寫的文件名(如Windows或Mac系統)的系統上運行MySQL這個變量設置為0。如果使用--lower-case-table-names=0 不區分大小寫的文件系統強制此變量為0 並MyISAM使用不同的字母表訪問 表名,則可能導致索引損壞。 |
| 1 | 表名以小寫形式存儲在磁盤上,名稱比較不區分大小寫。MySQL在存儲和查找時將所有表名轉換為小寫。此行為也適用於數據庫名稱和表別名。 |
| 2 | 表和數據庫名稱使用CREATE TABLEor CREATE DATABASE語句中指定的lettercase存儲在磁盤上,但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,您看不到原始字母中的名稱。
使用 lower_case_table_names=0 在 Unix 和 lower_case_table_names=2Windows 上。這樣可以保留數據庫和表名的字母大小寫。這樣做的缺點是您必須確保您的語句始終在 Windows 上使用正確的字母大小引用您的數據庫和表名。如果將語句轉移到 Unix,那么 lettercase 很重要,如果 lettercase 不正確,它們就不起作用。
- 例外:如果您正在使用 InnoDB 表並且您試圖避免這些數據傳輸問題,則應 lower_case_table_names 在所有平台上將其設置為 1 以強制將名稱轉換為小寫。
如果您計划lower_case_table_names在Unix上將系統變量設置 為1,則必須先將舊數據庫和表名轉換為小寫,然后再停止 mysqld並使用新變量設置重新啟動它。要對單個表執行此操作,請使用 RENAME TABLE:
- 翻譯自 mysql 官網,原文鏈接:https://dev.mysql.com/doc/refman/5.7/en/identifier-case-sensitivity.html
