2014-10-20 31 views
4

在我的Windows機器上,當我從MySQL中使用下面的查詢選擇表名時,我得到表名稱區分大小寫。與Windows中的MySql區分大小寫的表名的奇怪行爲

mysql> select table_schema, table_name 
from information_schema.tables where table_schema='test'; 
+--------------+------------+ 
| table_schema | table_name | 
+--------------+------------+ 
| test   | TableOne | 
| test   | TableTwo | 
+--------------+------------+ 
2 rows in set (0.00 sec) 

但是,當我通過表名選擇我得到不同的結果。

mysql> select table_schema, table_name from information_schema.tables 
where table_schema='test' and table_name = 'TableOne'; 
+--------------+------------+ 
| table_schema | table_name | 
+--------------+------------+ 
| test   | tableone | 
+--------------+------------+ 
1 row in set (0.00 sec) 

這是什麼讓它更奇怪呢。

mysql> select table_schema, table_name from information_schema.tables 
where table_schema='test' and table_name like 'TableOne'; 
+--------------+------------+ 
| table_schema | table_name | 
+--------------+------------+ 
| test   | TableOne | 
+--------------+------------+ 
1 row in set (0.00 sec) 

回答

3

有一個名爲lower_case_table_names的MySql變量。當它被設置爲0表名是區分大小寫的。但是這不建議在Windows等大小寫不敏感的機器上使用。下一個選項是1。在此選項中,即使在存儲之前,所有表名都會轉換爲小寫字母。在這種情況下,你總是會得到小寫的表名。在我的情況下,這個變量的值被設置爲2。在這種情況下,MySql存儲表名,但是當我們比較表名時,它會將它們轉換爲小寫並進行比較。

所以在第一種情況下,表名並不進行比較,因此我們得到原始值。

在第二種情況下,我們正在比較表名,所以mysql將表名轉換爲小寫字母進行比較。但奇怪的是,他們正在返回轉換後的值,而不是原始值。

最後在第三種情況下,我們使用的like運算符本身不區分大小寫,因此mysql不會將表名轉換爲小寫,並且我們得到原始結果。