2012-02-25 80 views
6

问题是我们正在开发Windows机器,并且一旦完成,我们将代码部署在unix机器上。该代码在Windows上运行良好,但是在unix中,我们在更改表名后出现错误,如'没有这样的表存在',正确的情况下它在UNIX中也能正常工作。实际上,在Windows中,默认情况下没有区分大小写的表名,但是在unix中它们确实有(读取MySQL表实际上是文件,而在unix中我们具有区分大小写的文件名,但不在Windows中)。解决方法可能是再次创建所有表,并让表名以小写字母表示。是的,我们也可以这样做,那很好。如何在MySql中强制区分大小写的表名和列名?

但是,我们仍然可以在MySql(Windows机器)中的表名上加上区分大小写。如果是的话,请让我知道如何做到这一点。

+0

这是一个有趣的问题。导致类似于Windows中的SQL工作而不是基于Unix的系统出现问题。 AFAIK,没有解决办法。 – Nishant 2012-02-25 09:34:55

回答

4

在Unix上,lower_case_table_names的默认值为0.在Windows上,默认值为1.在Mac OS X上,MySQL 4.0.18之前的默认值为1,4.0.18的默认值为2。

要解决此问题,您可以在您的my.ini文件中找到设置:lower_case_table_names,位于或位于:C:\ Program Files \ MySQL \ MySQL Server 4.1中,具体取决于您正在运行的版本。如果你没有找到设置,你可以将它添加到my.ini文件的结尾,像我一样,像这样:

lower_case_table_names=0 

记住你测试是否之前重新启动MySQL服务有用。

如果您仅在一个平台上使用MySQL,则通常不必将lower_case_table_names变量从其默认值更改。但是,如果要在文件系统区分大小写不同的平台之间传输表,可能会遇到困难。例如,在Unix上,可以有两个名为my_table和MY_TABLE的表,但在Windows上,这些名称被认为是相同的。为了避免数据库或表名称发生数据传输问题,您有两种选择:

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

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

例外情况:如果您正在使用InnoDB表,并且您试图避免这些数据传输问题,则应在所有平台上将lower_case_table_names设置为1以强制名称转换为小写。

如果您打算在Unix上将lower_case_table_names系统变量设置为1,则必须先将旧数据库和表名称转换为小写,然后再停止mysqld并使用新变量设置重新启动它。

请查看MySQL的网站有关此的其他信息,以及一些重要的警告http://dev.mysql.com/doc/refman/4.1/en/identifier-case-sensitivity.html

5

设置被称为lower_case_table_names。如果将其设置为0,则比较将区分大小写。

然而,

如果你有不区分大小写的文件名(如Windows或Mac OS X)的系统上运行MySQL你不应该将此变量设置为0。如果在不区分大小写的文件系统上使用--lower-case-table-names = 0强制将此变量设置为0,并使用不同的lettercase访问MyISAM表名,则可能导致索引损坏。

在所有系统(包括Linux)上使所有表名小写,即。将其设置为值1,听起来像是更好的选择:

表名称在磁盘上以小写形式存储,名称比较不区分大小写。 MySQL在存储和查找时将所有表名称转换为小写字母。这种行为也适用于数据库名称和表别名。

+0

问题是我可以更改设置在Windows机器,但不是在UNIX系统。通过这个解决方案,如果我有访问my.ini文件在Unix中我可以改变这个设置为1,它会解决这个问题。但我想换一种方式。意思,而不是unix中的表不区分大小写,我想在Windows中的表格区分大小写。 – 2012-02-25 10:02:51

+0

@Rakesh查看选项'0',但不推荐。我不明白第一个问题是怎么发生的 - 你不能确保你的代码使用正确的名字吗?部署到Linux时,表名在某些时候是否发生了变化? – 2012-02-25 10:04:23