Related Documentation Download this Manual
PDF (US Ltr) - 40.8Mb
PDF (A4) - 40.9Mb
Man Pages (TGZ) - 294.0Kb
Man Pages (Zip) - 409.0Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb
Excerpts from this Manual

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

11.2.3 标识符大小写敏感性

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

Note

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

Value Meaning
0 表和数据库名称在磁盘上使用 CREATE TABLECREATE DATABASE 语句中指定的字母大小写进行存储。名称比较是区分大小写的。你不应该在 case-insensitive 文件系统(如 Windows 或 macOS)上将该变量设置为 0。如果你强制将该变量设置为 0 并在 case-insensitive 文件系统上访问 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 搜索中使用排序”