MySQL 9.0 参考手册  /  ...  /  标识符大小写敏感性

11.2.3 标识符大小写敏感性

在 MySQL 中,数据库对应于数据目录中的目录。数据库中的每个表至少对应于数据库目录中的一个文件(可能更多,具体取决于存储引擎)。触发器也对应于文件。因此,底层操作系统的区分大小写规则在数据库、表和触发器名称的区分大小写规则中起着作用。这意味着此类名称在 Windows 中不区分大小写,但在大多数 Unix 版本中区分大小写。一个值得注意的例外是 macOS,它是基于 Unix 的,但使用默认的文件系统类型(HFS+),该类型不区分大小写。但是,macOS 也支持 UFS 卷,这些卷与任何 Unix 一样区分大小写。请参阅 第 1.7.1 节“MySQL 对标准 SQL 的扩展”lower_case_table_names 系统变量也会影响服务器如何处理标识符区分大小写规则,如本节稍后所述。

注意

尽管数据库、表和触发器名称在某些平台上不区分大小写,但您不应在同一个语句中使用不同的大小写来引用其中一个。以下语句将不起作用,因为它将表称为 my_tableMY_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 中使用,受 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 设置。

含义
0 表和数据库名称使用 CREATE TABLECREATE DATABASE 语句中指定的大小写存储在磁盘上。名称比较区分大小写。如果您在文件名不区分大小写的系统(例如 Windows 或 macOS)上运行 MySQL,则不应将此变量设置为 0。如果在区分大小写的文件系统上使用 --lower-case-table-names=0 将此变量强制设置为 0,并且使用不同的大小写访问 MyISAM 表名,则可能会导致索引损坏。
1 表名在磁盘上以小写形式存储,并且名称比较不区分大小写。MySQL 在存储和查找时将所有表名转换为小写。此行为也适用于数据库名称和表别名。
2 表和数据库名称使用 CREATE TABLECREATE DATABASE 语句中指定的大小写存储在磁盘上,但 MySQL 在查找时会将它们转换为小写。名称比较不区分大小写。这适用于不区分大小写的文件系统! InnoDB 表名和视图名以小写形式存储,如 lower_case_table_names=1 一样。

如果仅在一个平台上使用 MySQL,则通常不必使用 lower_case_table_names 设置(默认设置除外)。但是,如果要将表在文件系统区分大小写规则不同的平台之间传输,则可能会遇到困难。例如,在 Unix 上,您可以有两个名为 my_tableMY_TABLE 的不同表,但在 Windows 上,这两个名称被视为相同。为了避免由于数据库或表名的字母大小写而引起的数据传输问题,您有两种选择:

  • 在所有系统上使用 lower_case_table_names=1。这样做的主要缺点是,当您使用 SHOW TABLESSHOW DATABASES 时,您不会看到原始字母大小写的名称。

  • 在 Unix 上使用 lower_case_table_names=0,在 Windows 上使用 lower_case_table_names=2。这将保留数据库和表名的字母大小写。这样做的缺点是,您必须确保在 Windows 上,您的语句始终使用正确的字母大小写来引用数据库和表名。如果您将语句传输到区分大小写的 Unix 上,如果字母大小写不正确,则它们将不起作用。

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

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

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