问题是我们正在开发Windows机器,一旦完成,我们就在unix机器上部署代码 . 代码在Windows上工作正常,但在unix中我们得到错误,如'没有这样的表存在'后更改表名称,在正确的情况下它也可以在unix中正常工作 . 实际上,在Windows中,默认情况下没有区分大小写的表名,但是在unix中它们确实有(读取MySQL表实际上是文件,在unix中我们有区分大小写的文件名但不在windows中) . 解决方法可能是再次创建所有表,并让表名称为小写 . 是的,我们也可以这样做,没关系 .
但是,我们仍然可以对MySql(windows机器)中的表名强加区分大小写 . 如果是,那么请让我知道如何做到这一点 .
3 回答
该设置称为lower_case_table_names . 如果将其设置为
0
,则比较将区分大小写 .然而,
在所有系统(包括Linux)中使所有表名小写,即 . 将其设置为
1
的值,听起来更好的选择:在Unix上,
lower_case_table_names
的默认值为0.在Windows上,默认值为1.在Mac OS X上,MySQL 4.0.18之前的默认值为1,默认值为4.0.18 .要解决此问题,您可以在my.ini文件中查找设置:lower_case_table_names,可在以下位置找到:C:\ Program Files \ MySQL \ MySQL Server 4.1,具体取决于您运行的版本 . 如果找不到该设置,可以像我一样将它添加到my.ini文件的末尾,如下所示:
在测试它是否有效之前,请记住重新启动MySQL服务 .
如果您只在一个平台上使用MySQL,则通常不必将lower_case_table_names变量从其默认值更改 . 但是,如果要在文件系统区分大小写不同的平台之间传输表,则可能会遇到困难 . 例如,在Unix上,您可以有两个名为my_table和MY_TABLE的不同表,但在Windows上,这些名称被认为是相同的 . 为避免数据库或表名字母的数据传输问题,您有两种选择:
在所有系统上使用lower_case_table_names = 1 . 这样做的主要缺点是,当您使用SHOW TABLES或SHOW DATABASES时,您看不到原始lettercase中的名称 .
在Unix上使用lower_case_table_names = 0,在Windows上使用lower_case_table_names = 2 . 这样可以保留数据库和表名的字母大小写 . 这样做的缺点是您必须确保您的语句始终在Windows上使用正确的字母大小引用您的数据库和表名 . 如果将语句转移到Unix,那么lettercase很重要,如果lettercase不正确,它们就不起作用 .
例外:如果您正在使用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
您可以将代码放在JPA中,将所有物理,模式,序列和表名称转换为小写,并在两个系统上使用大小写,以便数据库可以从Windows导出并可以毫不费力地导入Unix .
在某个地方添加这个类:
并将此属性添加到persistence.xml