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

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

假设一个查询搜索图式。模式名称列为测验数据库在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)

这些结果发生在小写字母表名称系统变量设置为0。A.小写字母表名称设置为1或2会导致第二个查询返回与第一个查询相同的(非空)结果。

笔记

禁止用电源启动服务器小写字母表名称与服务器初始化时使用的设置不同的设置。

在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        |
+-------------+

价值小写字母表名称在这种情况下没有区别。

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

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

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        |
+-------------+

你也可以使用上()下()功能:

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 |
+--------------------+