windows下mysql区分大小写敏感问题

默认情况下,表别名在Unix上区分大小写,但在Windows或macOS上不是这样。以下语句在Unix上不起作用,因为它引用别名as a和as A:

mysql> SELECT col_name FROM tbl_name AS a
    -> WHERE a.col_name = 1 OR A.col_name = 2;

但是,Windows上允许使用相同的语句。为避免此类差异导致的问题,最好采用一致的约定,例如始终使用小写名称创建和引用数据库和表。建议使用此约定,以实现最大的便携性和易用性。

表和数据库名称如何存储在磁盘上并在 MySQL 中使用受 lower_case_table_names 系统变量的影响,您可以在启动 mysqld 时设置该 变量 。 lower_case_table_names 可以采用下表中显示的值。这个变量不不影响触发标识符的情况下的灵敏度。在Unix上,默认值为 lower_case_table_names 为 0 ,在 Windows 上,默认值为 1,在 macOS 上,默认值为 2 。


含义
0 表和数据库名称使用CREATE TABLEor CREATE DATABASE语句中指定的lettercase存储在磁盘上。名称比较区分大小写。你应该不会,如果你有不区分大小写的文件名(如Windows或Mac系统)的系统上运行MySQL这个变量设置为0。如果使用--lower-case-table-names=0 不区分大小写的文件系统强制此变量为0 并MyISAM使用不同的字母表访问 表名,则可能导致索引损坏。
1 表名以小写形式存储在磁盘上,名称比较不区分大小写。MySQL在存储和查找时将所有表名转换为小写。此行为也适用于数据库名称和表别名。
2 表和数据库名称使用CREATE TABLEor CREATE DATABASE语句中指定的lettercase存储在磁盘上,但MySQL在查找时将它们转换为小写。名称比较不区分大小写。这仅适用于不区分大小写的文件系统! InnoDB表名和视图名以小写形式存储,如下所示 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,您看不到原始字母中的名称。

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

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

如果您计划lower_case_table_names在Unix上将系统变量设置 为1,则必须先将旧数据库和表名转换为小写,然后再停止 mysqld并使用新变量设置重新启动它。要对单个表执行此操作,请使用 RENAME TABLE:

posted @ 2018-07-16 11:16  jonnyan  阅读(5961)  评论(0编辑  收藏  举报