### 9.2.3 标识符大小写敏感性

[](<>)[](<>)[](<>)[](<>)[](<>)[](<>)[](<>)[](<>)[](<>)

在 MySQL 中，数据库对应于数据目录中的目录。数据库中的每个表对应于数据库目录中的至少一个文件（可能更多，取决于存储引擎）。触发器也对应于文件。因此，底层操作系统的大小写敏感性在数据库、表和触发器名称的大小写敏感性中起作用。这意味着此类名称在 Windows 中不区分大小写，但在大多数 Unix 中都区分大小写。一个值得注意的例外是 macOS，它基于 Unix，但使用不区分大小写的默认文件系统类型 (HFS+)。然而，macOS 也支持 UFS 卷，它是区分大小写的，就像在任何 Unix 上一样。看[第 1.7.1 节，“标准 SQL 的 MySQL 扩展”](extensions-to-ansi.html).这[`lower_case_table_names`](server-system-variables.html#sysvar_lower_case_table_names)系统变量也会影响服务器如何处理标识符区分大小写，如本节后面所述。

笔记

尽管在某些平台上数据库、表和触发器名称不区分大小写，但您不应在同一语句中使用不同大小写来引用其中之一。以下语句不起作用，因为它同时引用了一个表`我的表`并作为`MY_TABLE`：

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

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

但是，日志文件组的名称区分大小写。这与标准 SQL 不同。

默认情况下，表别名在 Unix 上区分大小写，但在 Windows 或 macOS 上不区分大小写。以下语句不适用于 Unix，因为它同时引用别名`一种`并作为`一种`：

```
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`](server-system-variables.html#sysvar_lower_case_table_names)系统变量。[`lower_case_table_names`](server-system-variables.html#sysvar_lower_case_table_names)可以取下表中所示的值。这个变量*不*影响触发器标识符的大小写敏感度。在Unix上，默认值为[`小写字母表名称`](server-system-variables.html#sysvar_lower_case_table_names)是0。在Windows上，默认值为1。在macOS上，默认值为2。

[`小写字母表名称`](server-system-variables.html#sysvar_lower_case_table_names)只能在初始化服务器时配置。改变[`小写字母表名称`](server-system-variables.html#sysvar_lower_case_table_names)禁止在服务器初始化后进行设置。

| 价值 | 意思 |
| --- | --- |
| `0` | 表和数据库名称使用[`创建表格`](create-table.html)或[`创建数据库`](create-database.html)陈述名称比较区分大小写。你应该*不*如果在文件名不区分大小写的系统（如Windows或macOS）上运行MySQL，请将此变量设置为0。如果用[`--小写表格名称=0`](server-system-variables.html#sysvar_lower_case_table_names)在不区分大小写的文件系统和access上`米萨姆`使用不同字母箱的表名可能会导致索引损坏。 |
| `1.` | 表名以小写形式存储在磁盘上，名称比较不区分大小写。MySQL在存储和查找时将所有表名转换为小写。这种行为也适用于数据库名称和表别名。 |
| `2.` | 表和数据库名称使用[`创建表格`](create-table.html)或[`创建数据库`](create-database.html)语句，但MySQL会在查找时将其转换为小写。名称比较不区分大小写。这很管用*只有*在不区分大小写的文件系统上！`InnoDB`表名和视图名以小写形式存储，例如`小写字母表名称=1`. |

如果只在一个平台上使用MySQL，通常不需要使用[`小写字母表名称`](server-system-variables.html#sysvar_lower_case_table_names)设置而不是默认设置。但是，如果要在文件系统区分大小写不同的平台之间传输表，可能会遇到困难。例如，在Unix上，可以有两个名为`我的桌子`和`我的桌子`，但在Windows上，这两个名称被认为是相同的。为了避免数据库或表名的字母大写引起的数据传输问题，您有两个选项：

-   使用`小写字母表名称=1`在所有系统上。这样做的主要缺点是[`展示桌子`](show-tables.html)或[`显示数据库`](show-databases.html)，你看不到他们原来的信箱里的名字。

-   使用`小写字母表名称=0`关于Unix和`小写字母表名称=2`在窗户上。这将保留数据库和表名的字母大小写。这样做的缺点是，您必须确保您的语句在Windows上总是使用正确的大小写引用数据库和表名。如果您将语句传输到Unix，而Unix中的字母大写很重要，那么如果字母大写不正确，语句将不起作用。

     **例外**：如果你正在使用`InnoDB`如果要避免这些数据传输问题，应该使用[`小写字母表名称=1`](server-system-variables.html#sysvar_lower_case_table_names)在所有平台上强制将名称转换为小写。

    如果根据二进制排序规则，对象名的大写形式相同，则可以认为它们是重复的。游标、条件、过程、函数、保存点、存储的例程参数、存储的程序局部变量和插件的名称也是如此。列、约束、数据库、分区和用[`准备`](prepare.html)、表、触发器、用户和用户定义的变量。

    文件系统区分大小写可能会影响字符串列中的搜索`信息模式`桌子。有关更多信息，请参阅[第10.8.7节，“在信息中使用排序规则\_“模式搜索”](charset-collation-information-schema.html).
