2012-07-04 245 views
1

我有错误,当我尝试查询小写的我的MySQL表:MySQL和字母大小写

mysql> select * from selection_vc limit 1; 
ERROR 1146 (42S02): Table 'mydb.selection_vc' doesn't exist 

当我使用大写,一切都OK了:

mysql> select * from SELECTION_VC limit 1; 
+-------------+-------------+-------------+--------+ 
| CAMPAIGN_ID | CONTACT_ID | COLUMN_NAME | MONTH | 
+-------------+-------------+-------------+--------+ 
| ALCA-32515W | ALCA-2X08DX | A   | 201207 | 
+-------------+-------------+-------------+--------+ 
1 row in set (0.00 sec) 

我有这样的错误(功能?)仅限于表名,列名可以以小写或大写形式访问。这只发生在我安装在Linux上的数据库中,我的Mac上没有这个问题。

我错过了MySQL配置中的一些东西,或者这是一个错误?

回答

5

如在手册的Identifier Case Sensitivity部分中描述:

在MySQL,数据库对应于数据目录中的目录。数据库中的每个表对应于数据库目录中的至少一个文件(可能更多,取决于存储引擎)。触发器也对应于文件。因此,底层操作系统的区分大小写在数据库,表和触发器名称的区分大小写的情况下起作用。这意味着这些名称在Windows中不区分大小写,但在大多数Unix中都区分大小写。一个明显的例外是Mac OS X,它基于Unix,但使用不区分大小写的默认文件系统类型(HFS +)。

它接着说:

为了避免从数据库或表名的大小写出现数据传输问题,你有两个选择:

  • 在所有系统上使用lower_case_table_names=1。这样做的主要缺点是,当您使用SHOW TABLESSHOW DATABASES时,您看不到原始lettercase中的名称。

  • 在Windows上使用lower_case_table_names=0,在Windows上使用lower_case_table_names=2。这保留了数据库和表名的字母大小写。这样做的缺点是,您必须确保您的语句始终在Windows上使用正确的lettercase引用数据库和表名。如果你将你的语句转移到Unix中,那么lettercase是有意义的,如果这个casecase是不正确的,它们就不起作用。

    异常:如果您正在使用InnoDB表和你正试图避免这些数据传输的问题,您应该在所有平台上设置lower_case_table_names 1,以强制的名称转换为小写。

+0

你打我:) – Romain

+0

感谢您的回答! –

相关问题