MySQL 8.4 Reference Manual  /  ...  /  Identifier Case Sensitivity

11.2.3 标识符大小写敏感性

在 MySQL 中,数据库对应于数据目录中的目录。每个表都对应至少一个文件(可能更多,取决于存储引擎)。触发器也对应文件。因此,底层操作系统的大小写敏感性对数据库、表和触发器名称的大小写敏感性产生影响。这意味着这些名称在 Windows 中不是大小写敏感的,但是在大多数 Unix 版本中是大小写敏感的。macOS 是一个例外,它基于 Unix 但使用默认文件系统类型(HFS+),该类型不是大小写敏感的。但是,macOS 也支持 UFS 卷,这些卷在 Unix 中一样大小写敏感。请参阅第 1.7.1 节,“MySQL 扩展到标准 SQL”。系统变量lower_ case_table_names也影响服务器如何处理标识符大小写敏感性,后续部分将对其进行描述。

Note

虽然在某些平台上数据库、表和触发器名称不是大小写敏感的,但是在同一个语句中不要使用不同的大小写来引用其中的一个。以下语句将无法工作,因为它同时引用了一个表作为my_ table和作为MY_TABLE:

mysql> SELECT * FROM my_table WHERE MY_TABLE.col=1;

分区、子分区、列、索引、存储程序、事件和资源组名称在任何平台上都不是大小写敏感的,也不是列别名。

然而,日志文件组名称是大小写敏感的。这与标准 SQL 不同。

默认情况下,Unix 下的表别名是区分大小写的,而 Windows 或 macOS 下不是。以下语句在 Unix 上将无法工作,因为它同时引用了aA两个别名:

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

然而,这个同样的语句在 Windows 上是允许的。为了避免由这种差异引起的问题,建议遵循一致的约定,例如总是使用小写名称创建和引用数据库和表。这一约定被推荐,以便提高可移植性和使用方便性。

MySQL 在磁盘上存储表和数据库名称,以及在 MySQL 中使用它们受到lower_case_table_names系统变量的影响。lower_case_table_names可以取值如以下表所示。这一变量不影响触发器标识符的区分大小写。Unix 上lower_case_table_names的默认值为0,Windows 上为1,macOS 上为2。

lower_case_table_names只能在初始化服务器时配置。修改lower_case_table_names设置后服务器已经初始化是禁止的。

Value Meaning
0 表名和数据库名在磁盘上使用CREATE TABLECREATE DATABASE语句中指定的字母大小写。名称比较是区分大小写的。你不应该将这个变量设置为0,如果你在运行MySQL的系统上有区分大小写的文件名(如Windows或macOS)。如果你强制将这个变量设置为0,使用--lower-case-table-names=0在区分大小写的文件系统上,并访问MyISAM表名时,使用不同的字母大小写可能会导致索引损坏。
1 表名在磁盘上存储为小写,并且名称比较不是区分大小写。MySQL将所有表名转换为小写进行存储和查找。这也适用于数据库名和表别名。
2 表名和数据库名在磁盘上使用CREATE TABLECREATE DATABASE语句中指定的字母大小写,但MySQL在查找时将其转换为小写。名称比较不是区分大小写。这只适用于非区分大小写的文件系统!InnoDB表名和视图名存储为小写,类似于lower_case_table_names=1

如果您只在一个平台上使用 MySQL,您通常不需要使用除了默认值以外的lower_case_表名设置。然而,如果您想将表之间传输到具有不同文件系统大小写敏感性的平台,您可能会遇到问题。例如,在 Unix 上,您可以有两个不同的表名my_表MY_表,但是在 Windows 上这两个名称被认为是相同的。为了避免来自数据库或表名大小写的数据传输问题,您有两种选择:

  • 在所有系统上使用lower_case_表名=1。这个主要缺点是,当您使用SHOW 表SHOW 数据库时,您不能看到名称的原始大小写。

  • 在 Unix 上使用lower_case_表名=0,在 Windows 上使用lower__case_table_names=2。这个保留了数据库和表名的大小写。这个缺点是,您必须确保您的语句总是在 Windows 上正确地引用数据库和表名的大小写。如果您将语句传输到 Unix 上,其中大小写是重要的,它们将不工作如果大小写不正确。

    异常:如果您使用的是InnoDB表,并且想避免这些数据传输问题,您应该在所有平台上设置lower_ case_table_names=1,强制将名称转换为小写。

对象名称可能被认为是重复的,如果它们的大写形式根据二进制排序规则相等。对于游标、条件、存储程序、函数、保存点、存储程序参数、存储程序局部变量和插件的名称,这是正确的。但是,对于列名、约束、数据库、分区、使用PREPARE语句准备的语句、表格、触发器、用户和自定义变量的名称,这不是正确的。

文件系统的大小写敏感性可能会影响INFORMATION_SCHEMA表中的字符串列搜索。更多信息,请见第12.8.7节,“使用排序规则在INFORMATION_SCHEMA搜索中”