top
Loading...
9.2.2.識別符大小寫敏感性
9.2.2. 識別符大小寫敏感性

MySQL中,數據庫對應數據目錄中的目錄。數據庫中的每個表至少對應數據庫目錄中的一個文件(也可能是多個,取決于存儲引擎)。因此,所使用操作系統的大小寫敏感性決定了數據庫名和表名的大小寫敏感性。這說明在大多數Unix中數據庫名和表名對大小寫敏感,而在Windows中對大小寫不敏感。一個顯著的例外情況是Mac OS X,它基于Unix但使用默認文件系統類型(HFS+),對大小寫不敏感。然而,Mac OS X也支持UFS卷,該卷對大小寫敏感,就像Unix一樣。參見1.8.4節,“MySQL對標準SQL的擴展”。

注釋:盡管在某些平臺中數據庫名和表名對大小寫不敏感,不應在同一查詢中使用不同的大小寫來引用給定的數據庫或表。下面的查詢不會工作,因為它同時引用了表my_tablesas MY_tables

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

列、索引、存儲子程序和觸發器名在任何平臺上對大小寫不敏感,列的別名也不敏感。

默認情況,表別名在Unix中對大小寫敏感,但在WindowsMac OS X中對大小寫不敏感。下面的查詢在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_tables_name系統變量確定,可以在啟動mysqld時設置。lower_case_tables_name可以采用下面的任一值:

含義

0

使用CREATE TABLECREATE DATABASE語句指定的大寫和小寫在硬盤上保存表名和數據庫名。名稱比較對大小寫敏感。在Unix系統中的默認設置即如此。請注意如果在大小寫不敏感的文件系統上用--lower-case-table-names=0強制設為0,并且使用不同的大小寫訪問MyISAM表名,會導致索引破壞。

1

表名在硬盤上以小寫保存,名稱比較對大小寫敏感。MySQL將所有表名轉換為小寫以便存儲和查找。該行為也適合數據庫名和表的別名。該值為WindowsMac OS X系統中的默認值。

2

表名和數據庫名在硬盤上使用CREATE TABLECREATE DATABASE語句指定的大小寫進行保存,但MySQL將它們轉換為小寫以便查找。名稱比較對大小寫敏感。釋:在對大小寫不敏感的文件系統上適用! InnoDB表名以小寫保存,例如lower_case_tables_name=1

WindowsMac OS X中,lower_case_tables_name的 默認值是1

如果只在一個平臺上使用MySQL,通常不需要更改lower_case_tables_name變量。然而,如果你想要在對大小寫敏感不同的文件系統的平臺之間轉移表,會遇到困難。例如,在Unix中,my_tablesMY_tables是兩個不同的表,但在Windows中,這兩個表名相同。要想避免由于數據庫或表名的大小寫造成的數據轉移問題,可使用兩個選項:

·         在任何系統中可以使用lower_case_tables_name=1。使用該選項的不利之處是當使用SHOW TABLESSHOW DATABASES時,看不出名字原來是用大寫還是小寫。

·         Unix中使用lower_case_tables_name=0,在Windows中使用lower_case_tables_name=2。這樣了可以保留數據庫名和表名的大小寫。不利之處是必須確保在Windows中查詢總是用正確大小寫引用數據庫名和表名。如果將查詢轉移到Unix中,由于在Unix中大小寫很重要,如果大小寫不正確,它們不工作。

例外:如果你正使用InnoDB表,在任何平臺上均應將lower_case_tables_name設置為1,以強制將名轉換為小寫。

請注意在Unix中將lower_case_tables_name設置為1之前,重啟mysqld之前,必須先將舊的數據庫名和表名轉換為小寫。

作者:mysql.com
來源:http://dev.mysql.com/doc/refman/5.1/zh/language-structure.html
北斗有巢氏 有巢氏北斗