MySql - 不同服务器中表的区分大小写问题

时间:2012-04-25 05:32:06

标签: php mysql sql

我在三个不同的服务器上工作,这些服务器是unix / windows / unix。

case-1:在我的loix服务器是unix,我有一个表名Country_master,其字段为pk_CountryId,CountryName等。

case-2:在我的演示服务器中,窗口表名称自动更改为country_master。

case-3:在我的Live服务器中,它是unix表名country_master。

但是在我的代码表名称中我采用的是Country_master所以它给我这样的错误

Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[42S02]: Base table or view not found: 1146 Table 'markets.Country_master' doesn't exist'.

我有什么办法可以不在数据库和代码中更改表名但是它需要小写?

4 个答案:

答案 0 :(得分:2)

您可以通过设置lower_case_table_names系统变量来更改区分大小写。请参阅此处获取说明:

http://dev.mysql.com/doc/refman/5.6/en/identifier-case-sensitivity.html

答案 1 :(得分:2)

来自fine manual

  

在MySQL中,数据库对应于数据目录中的目录。数据库中的每个表对应于数据库目录中的至少一个文件(并且可能更多,取决于存储引擎)。触发器也对应于文件。因此,底层操作系统的区分大小写在数据库,表和触发器名称的区分大小写中起作用。

因此,表名的区分大小写取决于底层文件系统:它们(通常)在Windows和OSX上(通常)不区分大小写,但在Linux上区分大小写。此行为部分取决于lower_case_table_names设置:

  

如果设置为0,表名将按指定的方式存储,并且比较区分大小写。如果设置为1,则表名称以小写形式存储在磁盘上,并且比较不区分大小写。如果设置为2,则表名称将按给定方式存储,但会以小写形式进行比较。此选项也适用于数据库名称和表别名。

因此,您有各种会影响表名称区分大小写的内容。唯一合理的解决方案(IMO)是始终使用小写表名,这样您就不必担心它;您还应该使用小写列名称来保持一致性。

答案 2 :(得分:1)

http://dev.mysql.com/doc/refman/5.0/en/identifier-case-sensitivity.html

  

9.2.2。标识符区分大小写在MySQL中,数据库对应于数据目录中的目录。数据库中的每个表   对应于数据库目录中的至少一个文件(和   可能更多,取决于存储引擎)。因此,   底层操作系统的区分大小写在其中起作用   数据库和表名的大小写敏感性。这意味着数据库   和表名在Windows中不区分大小写,并区分大小写   在大多数Unix版本中。一个值得注意的例外是Mac OS X,它是   基于Unix但使用默认文件系统类型(HFS +)并非如此   敏感。但是,Mac OS X也支持UFS卷   像任何Unix一样敏感。请参见第1.8.4节“MySQL扩展到   标准SQL“。 lower_case_table_names系统变量也会影响   如下所述,服务器如何处理标识符区分大小写   在本节中。

     

注意虽然数据库和表名称在某些情况下不区分大小写   平台,您不应该使用给定的数据库或表   同一陈述中的不同案例。以下声明   不起作用,因为它将表引用为my_table和as   MY_TABLE:

     

的MySQL> SELECT * FROM my_table WHERE MY_TABLE.col = 1;列,索引和   存储的例程名称在任何平台上都不区分大小写,也不是   列别名。触发器名称区分大小写,区别于   标准SQL。

     

默认情况下,表别名在Unix上区分大小写,但不是这样   Windows或Mac OS X.以下语句不适用于Unix,   因为它将别名称为a和A:

     

的MySQL> SELECT col_name FROM tbl_name AS a        - > WHERE a.col_name = 1或A.col_name = 2;但是,Windows上允许使用相同的语句。避免由此引起的问题   差异,最好采用一致的约定,如   始终使用小写创建和引用数据库和表   名。建议使用此约定以实现最大的便携性和易用性   使用。

     

表和数据库名称如何存储在磁盘上并在MySQL中使用   受lower_case_table_names系统变量影响,你可以   启动mysqld时设置。 lower_case_table_names可以取值   如下表所示。在Unix上,默认值为   lower_case_table_names为0.在Windows上,默认值为1.在Mac上   OS X,默认值为2。

     

值含义0使用表格和数据库名称存储在磁盘上   CREATE TABLE或CREATE DATABASE语句中指定的lettercase。   名称比较区分大小写。您不应该设置此变量   如果您在不区分大小写的系统上运行MySQL,则为0   文件名(例如Windows或Mac OS X)。如果强制使用此变量   在不区分大小写的文件系统上使用--lower-case-table-names = 0到0   并使用不同的lettercase,index访问MyISAM表名   腐败可能会导致。 1表名称以小写形式存储在磁盘上   和名称比较不区分大小写。 MySQL转换所有表   存储和查找时,名称为小写。此行为也适用   到数据库名称和表别名。 2表和数据库名称是   使用CREATE TABLE或中指定的lettercase存储在磁盘上   CREATE DATABASE语句,但MySQL将它们转换为小写   抬头。名称比较不区分大小写。这只适用于   文件系统不区分大小写! InnoDB表名是   以lowercase存储,与lower_case_table_names = 1一样。如果你正在使用   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,在lower_case_table_names = 2上使用   视窗。这样可以保留数据库和表名的字母大小写。   这样做的缺点是你必须确保你的陈述   总是用正确的方式引用你的数据库和表名   Windows上的字母。如果您将语句转移到Unix,那么   lettercase很重要,如果是lettercase,它们不起作用   不正确。

     

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

     

如果您打算将lower_case_table_names系统变量设置为1   Unix,您必须先将旧数据库和表名转换为   在停止mysqld并使用new重新启动它之前使用小写   变量设定。要对单个表执行此操作,请使用RENAME   表:

     

RENAME TABLE T1 TO t1;要转换一个或多个整个数据库,请转储   在设置lower_case_table_names之前,然后删除数据库,   并在设置lower_case_table_names之后重新加载它们:

     

使用mysqldump转储每个数据库:

     

mysqldump --databases db1> db1.sql mysqldump --databases db2>   db2.sql ...对每个必须重新创建的数据库执行此操作。

     

使用DROP DATABASE删除每个数据库。

     

停止服务器,设置lower_case_table_names,然后重新启动服务器。

     

重新加载每个数据库的转储文件。因为lower_case_table_names   设置后,每个数据库和表名都将转换为小写   它被重新创建:

     

mysql< db1.sql mysql< db2.sql ...可以考虑对象名称   如果它们的大写形式根据二进制形式相等则重复   排序规则。对于游标,条件,程序,   函数,保存点,存储的例程参数和存储的程序   局部变量。对于列名称的名称不是这样,   约束,数据库,用PREPARE编写的语句,表格,   触发器,用户和用户定义的变量。

答案 3 :(得分:1)

如果您使用MySQL,则可以使用以下指令

在my.conf中设置区分大小写的列和列名称
set-variable = lower_case_table_names=1

更新后不要忘记重启服务器。如果在所有服务器中使用相同的列名称会更好