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