在 MySQL 中,数据库对应于数据目录中的目录。数据库中的每个表至少对应于数据库目录中的一个文件(可能更多,具体取决于存储引擎)。触发器也对应于文件。因此,底层操作系统的大小写敏感对于数据库、表和触发器名称的大小写敏感中起着重要作用。这意味着这些名称在 Windows 中不区分大小写,但在大多数类 Unix 系统中是区分大小写的。一个值得注意的例外是 macOS,它基于 Unix,但使用不区分大小写的默认文件系统类型(HFS+)。但是,macOS 还支持 UFS 卷,它和任何 Unix 上的卷一样区分大小写。lower_case_table_names 系统变量也影响服务器处理标识符区分大小写的方式,如本节后面所述。尽管在某些平台上,数据库、表和触发器名称不区分大小写,但不应在同一语句中使用不同的大小写引用它们。以下语句不起作用,因为它同时使用 my_table 和 MY_TABLE 引用了一个表:mysql> SELECT * FROM my_table WHERE MY_TABLE.col=1;
复制
分区、子分区、列、索引、存储例程、事件和资源组名称在任何平台上都不区分大小写,列别名也不区分大小写。但是,日志文件组的名称区分大小写。这与标准 SQL 不同。默认情况下,表别名在 Unix 上区分大小写,但在 Windows 或 macOS 上则不区分大小写。以下语句在 Unix 上不起作用,因为它将别名同时引用为 a 和 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 系统变量的影响。lower_case_table_names 可以采用下表中所示的值。此变量不影响触发器标识符的大小写敏感度。在 Unix 上,lower_case_table_names 的默认值为 0。在 Windows 上,默认值为 1。在 macOS 上,默认值为 2。只有在初始化服务器时才能配置 lower_case_table_names。禁止在服务器初始化后更改 lower_case_table_names 设置。 | |
| 表和数据库名称使用在 CREATE TABLE 或 CREATE DATABASE 语句中指定的字母存储在磁盘上。名称比较是区分大小写的。如果 MySQL 在文件名不区分大小写的系统(如 Windows 或 macOS)上运行,则不应该将此变量设置为 0。如果在不区分大小写的文件系统上使用 --lower-case-table-names=0 强制将该变量设置为 0,并使用不同大小写的字母来访问 MyISAM 表名,可能会导致索引损坏。 |
| 表名以小写形式存储在磁盘上,名称比较不区分大小写。MySQL 在存储和查找时将所有表名转换为小写。此行为也适用于数据库名称和表别名。 |
| 表和数据库名称使用 CREATE TABLE 或 CREATE DATABASE 语句中指定的字母存储在磁盘上,但 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 命令时,不会看到原来用字母表示的名称大小写。● 在 Unix 上使用 lower_case_table_names=0, 在 Windows 上使用 lower_case_table_names=2。这保留了数据库和表名的字母大小写。这样做的缺点是,必须确保语句在 Windows 上总是用正确的字母来引用数据库和表名。如果将语句转移到 Unix (在Unix中,字母大小写是重要的),如果字母不正确,它们将不起作用。例外: 如果你正在使用 InnoDB 表,并且试图避免这些数据传输问题,应该在所有平台上使用 lower_case_table_names=1 来强制名称转换为小写。如果对象的大写形式根据二进制排序规则相等,则可以认为对象名称重复。这对于游标、条件、过程、函数、保存点、存储例程参数、存储程序本地变量和插件的名称都是如此。对于列、约束、数据库、分区、预编译语句、表、触发器、用户和用户定义变量名称,则不适用。文件系统大小写敏感可能会影响 INFORMATION_SCHEMA 表的字符串列中的搜索。https://dev.mysql.com/doc/refman/8.0/en/identifier-case-sensitivity.html