2014-10-20 48 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不会将表名转换为小写,并且我们得到原始结果。