### 10.8.7在信息中使用排序\_模式搜索

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

字符串列`信息模式`表格有一个排序规则`utf8\u概述\u ci`，不区分大小写。但是，对于与文件系统中表示的对象（如数据库和表）相对应的值，可以在`信息模式`字符串列可以区分大小写，也可以不区分大小写，具体取决于底层文件系统和[`小写字母表名称`](server-system-variables.html#sysvar_lower_case_table_names)系统变量设置。例如，如果文件系统区分大小写，则搜索可能区分大小写。本节介绍此行为以及在必要时如何修改它。

假设一个查询搜索`图式。模式名称`列为`测验`数据库在Linux上，文件系统区分大小写，因此`图式。模式名称`具有`“测试”`匹配，但与`“测试”`不要：

```
mysql> SELECT SCHEMA_NAME FROM INFORMATION_SCHEMA.SCHEMATA
       WHERE SCHEMA_NAME = 'test';
+-------------+
| SCHEMA_NAME |
+-------------+
| test        |
+-------------+

mysql> SELECT SCHEMA_NAME FROM INFORMATION_SCHEMA.SCHEMATA
       WHERE SCHEMA_NAME = 'TEST';
Empty set (0.00 sec)
```

这些结果发生在[`小写字母表名称`](server-system-variables.html#sysvar_lower_case_table_names)系统变量设置为0。A.[`小写字母表名称`](server-system-variables.html#sysvar_lower_case_table_names)设置为1或2会导致第二个查询返回与第一个查询相同的（非空）结果。

笔记

禁止用电源启动服务器[`小写字母表名称`](server-system-variables.html#sysvar_lower_case_table_names)与服务器初始化时使用的设置不同的设置。

在Windows或macOS上，文件系统不区分大小写，因此比较两者都匹配`“测试”`和`“测试”`:

```
mysql> SELECT SCHEMA_NAME FROM INFORMATION_SCHEMA.SCHEMATA
       WHERE SCHEMA_NAME = 'test';
+-------------+
| SCHEMA_NAME |
+-------------+
| test        |
+-------------+

mysql> SELECT SCHEMA_NAME FROM INFORMATION_SCHEMA.SCHEMATA
       WHERE SCHEMA_NAME = 'TEST';
+-------------+
| SCHEMA_NAME |
+-------------+
| TEST        |
+-------------+
```

价值[`小写字母表名称`](server-system-variables.html#sysvar_lower_case_table_names)在这种情况下没有区别。

发生上述行为是因为`utf8\u概述\u ci`排序规则不用于`信息模式`搜索与文件系统中表示的对象对应的值时进行查询。

如果`信息模式`列与预期不同，解决方法是使用显式`整理`子句强制进行适当的排序（参见[第10.8.1节，“在SQL语句中使用COLLATE”](charset-collate.html))。例如，要执行不区分大小写的搜索，请使用`整理`和`信息模式`列名：

```
mysql> SELECT SCHEMA_NAME FROM INFORMATION_SCHEMA.SCHEMATA
       WHERE SCHEMA_NAME COLLATE utf8_general_ci = 'test';
+-------------+
| SCHEMA_NAME |
+-------------+
| test        |
+-------------+

mysql> SELECT SCHEMA_NAME FROM INFORMATION_SCHEMA.SCHEMATA
       WHERE SCHEMA_NAME COLLATE utf8_general_ci = 'TEST';
+-------------+
| SCHEMA_NAME |
+-------------+
| test        |
+-------------+
```

你也可以使用[`上（）`](string-functions.html#function_upper)或[`下（）`](string-functions.html#function_lower)功能：

```
WHERE UPPER(SCHEMA_NAME) = 'TEST'
WHERE LOWER(SCHEMA_NAME) = 'test'
```

尽管如前所示，即使在具有区分大小写文件系统的平台上也可以执行不区分大小写的比较，但这并不一定总是正确的做法。在这样的平台上，可以有多个名称仅在字母大小写上不同的对象。例如，名为`城市`, `城市`和`城市`都可以同时存在。考虑搜索是否应匹配所有此类名称，或仅对应一个和写入查询。以下第一个比较（与`utf8_bin`)区分大小写；其他则不是：

```
WHERE TABLE_NAME COLLATE utf8_bin = 'City'
WHERE TABLE_NAME COLLATE utf8_general_ci = 'city'
WHERE UPPER(TABLE_NAME) = 'CITY'
WHERE LOWER(TABLE_NAME) = 'city'
```

搜索`信息模式`用于引用的值的字符串列`信息模式`它本身确实使用`utf8\u概述\u ci`因为`信息模式`是文件系统中未表示的“虚拟”数据库。例如，与`图式。模式名称`火柴`“信息模式”`或`“信息模式”`无论平台是什么：

```
mysql> SELECT SCHEMA_NAME FROM INFORMATION_SCHEMA.SCHEMATA
       WHERE SCHEMA_NAME = 'information_schema';
+--------------------+
| SCHEMA_NAME        |
+--------------------+
| information_schema |
+--------------------+

mysql> SELECT SCHEMA_NAME FROM INFORMATION_SCHEMA.SCHEMATA
       WHERE SCHEMA_NAME = 'INFORMATION_SCHEMA';
+--------------------+
| SCHEMA_NAME        |
+--------------------+
| information_schema |
+--------------------+
```
