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

131 0

问题是我们正在使用Windows机器,一旦完成,我们就在unix机器上部署代码。 代码在 Windows 上运行正常,但是在unix中,我们在更改表名后得到错误: 'no such table exists',一切正常的话,它应该可以在unix中工作正常 。 实际上,在Windows中,默认情况下没有区分大小写的表名,但是,在unix中它们确实有(读取MySQL表实际上是文件,在unix中我们有区分大小写的文件名,但是,不在windows中)。 解决办法可能是再次创建所有表,并使表名称以小写形式出现。 是的,我们也可以这样做,这样也可以。

但是,我们仍然想对MySql(windows机器)中的表名强制区分大小写。 如果可以,请让我知道怎么做。

时间: 原作者:

78 5

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

但是

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

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

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

原作者:
88 2

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

若要修复这个问题,可以查找该设置: lower_case_table_names在my.ini文件中, C:Program FilesMySQLMySQL 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上使用正确的字母大小引用你的数据库和表名。 如果您将语句转移到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

原作者:
92 0

您可以将代码放在JPA中,将所有物理,模式,序列和表名称转换为小写,并在两个系统上使用大小写,以便数据库可以从Windows导出,并且可以毫不费力地导入Unix。

将此类添加到某个位置:


public class ImprovedNamingStrategy implements PhysicalNamingStrategy {



 @Override


 public Identifier toPhysicalCatalogName(Identifier identifier, JdbcEnvironment jdbcEnv) {


 return convert(identifier);


 }



 @Override


 public Identifier toPhysicalColumnName(Identifier identifier, JdbcEnvironment jdbcEnv) {


 return convert(identifier);


 }



 @Override


 public Identifier toPhysicalSchemaName(Identifier identifier, JdbcEnvironment jdbcEnv) {


 return convert(identifier);


 }



 @Override


 public Identifier toPhysicalSequenceName(Identifier identifier, JdbcEnvironment jdbcEnv) {


 return convert(identifier);


 }



 @Override


 public Identifier toPhysicalTableName(Identifier identifier, JdbcEnvironment jdbcEnv) {


 return convert(identifier);


 }



/**


 * Converts table name.


 *


 * @param identifier


 * the identifier.


 * @return the identifier.


 */


 private Identifier convert(Identifier identifier) {


 if (identifier == null || identifier.getText().trim().isEmpty()) {


 return identifier;


 }


 return Identifier.toIdentifier(identifier.getText().toLowerCase());


 }


}



并将这里属性添加到你的persistence.xml


<property name="hibernate.physical_naming_strategy" value="ImprovedNamingStrategy"/>



...