如何在MySql中强制区分大小写的表和列名?

Rak*_*yal 10 mysql windows case-sensitive

问题是我们正在使用Windows机器,一旦完成,我们就在unix机器上部署代码.代码在Windows上正常工作,但在unix中我们得到错误,如'没有这样的表存在'更改表名后,在正确的情况下它也可以在unix中正常工作.实际上,在Windows中,默认情况下没有区分大小写的表名,但是在unix中它们确实有(读取MySQL表实际上是文件,在unix中我们有区分大小写的文件名但不在windows中).解决方法可能是再次创建所有表,并让表名称为小写.是的,我们也可以这样做,没关系.

但是,我们仍然可以对MySql(windows机器)中的表名强加区分大小写.如果是,那么请让我知道如何做到这一点.

Pek*_*ica 8

调用该设置lower_case_table_names.如果将其设置为0,则比较将区分大小写.

然而,

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

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

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


Pen*_*m10 6

在Unix上,默认值为lower_case_table_names0。在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
Run Code Online (Sandbox Code Playgroud)

在测试它是否有效之前,请记住重新启动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上始终以正确的字母大小写引用数据库和表名。如果将语句转移到大写字母的Unix,则如果大写字母不正确,则它们将不起作用。

例外:如果您正在使用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-sensitiveivity.html