字符串列INFORMATION_SCHEMA
表有一个排序utf8_general_ci
,这是不区分大小写的。但是,对于对应于文件系统中表示的对象的值,例如数据库和表,搜索INFORMATION_SCHEMA
字符串列可以区分大小写或不区分大小写,具体取决于底层文件系统的特征和lower_case_table_names
系统变量设置。例如,如果文件系统区分大小写,则搜索可能是区分大小写的。本节介绍此行为以及如何在必要时修改它。
假设一个查询搜索schemata.schema_name.
栏目测试
数据库。在Linux上,文件系统是区分大小写的,所以比较schemata.schema_name.
和'测试'
匹配,但比较“测试”
不:
mysql> SELECT SCHEMA_NAME FROM INFORMATION_SCHEMA。SCHEMATA WHERE SCHEMA_NAME = 'test';+-------------+ | SCHEMA_NAME | +-------------+ | 测试 | +-------------+ mysql >从INFORMATION_SCHEMA选择SCHEMA_NAME。Schemata where schema_name = ' test ';空集(0.00秒)
这些结果发生在lower_case_table_names
系统变量设置为0。一个lower_case_table_names
设置1或2会导致第二个查询返回与第一个查询相同(非空)的结果。
禁止使用lower_case_table_names
与服务器初始化时使用的设置不同的设置。
在Windows或MacOS上,文件系统不区分大小写,因此比较匹配'测试'
和“测试”
:
mysql> SELECT SCHEMA_NAME FROM INFORMATION_SCHEMA。SCHEMATA WHERE SCHEMA_NAME = 'test';+-------------+ | SCHEMA_NAME | +-------------+ | 测试 | +-------------+ mysql >从INFORMATION_SCHEMA选择SCHEMA_NAME。Schemata where schema_name = ' test ';+-------------+ | SCHEMA_NAME | +-------------+ | 测试 | +-------------+
的价值lower_case_table_names
在这种情况下没有区别。
出现前面的行为是因为utf8_general_ci
整理不用于INFORMATION_SCHEMA
在搜索与文件系统中表示的对象对应的值时进行查询。
如果字符串操作的结果INFORMATION_SCHEMA
列与期望不同,解决方法是使用明确的核对
迫使迫使合适的整理(见第10.8.1节,“在SQL语句中使用COLLATE”).例如,要执行不区分大小写的搜索,请使用核对
与INFORMATION_SCHEMA
列名称:
mysql> SELECT SCHEMA_NAME FROM INFORMATION_SCHEMA。SCHEMATA WHERE SCHEMA_NAME COLLATE utf8_general_ci = 'test';+-------------+ | SCHEMA_NAME | +-------------+ | 测试 | +-------------+ mysql >从INFORMATION_SCHEMA选择SCHEMA_NAME。SCHEMATA WHERE SCHEMA_NAME COLLATE utf8_general_ci = 'TEST';+-------------+ | SCHEMA_NAME | +-------------+ | 测试 | +-------------+
上部(架构_Name)='test',其中leow(schema_name)='test'
虽然即使在具有区分大小写的文件系统的平台上也可以执行不区分大小写的比较,但如图所示,它不一定总是正确的事情。在此类平台上,可以具有多个对象,其中名称仅在LetterCase中不同。例如,表格命名城市
那城市
,城市
全部可以同时存在。考虑搜索是否应匹配所有此类名称或仅匹配一个并相应地编写查询。第一个比较(与UTF8_BIN.
)区分大小写;其他人不是:
WHERE TABLE_NAME COLLATE utf8_bin = 'City' WHERE TABLE_NAME COLLATE utf8_general_ci = 'City' WHERE TABLE_NAME COLLATE utf8_bin = 'City' WHERE TABLE_NAME COLLATE utf8_ci = 'City'
搜索INFORMATION_SCHEMA
引用的值的字符串列INFORMATION_SCHEMA
本身确实使用了utf8_general_ci
排序,因为INFORMATION_SCHEMA
是A.“虚拟的“数据库未在文件系统中表示。例如,比较schemata.schema_name.
匹配“information_schema”
或'Information_schema'
无论平台如何:
MySQL>从Information_schema.schemata中选择schema_name,其中schema_name ='Information_schema';+ ------------------- + |schema_name |+ ------------------- + |Information_Schema |+ ------------------ + MySQL>从Information_schema.schemata中选择schema_name,其中schema_name ='Information_schema';+ ------------------- + |schema_name |+ ------------------- + |Information_Schema | +--------------------+