这是我用来获取MySQL数据库中存储过程列表的查询。
SELECT `SPECIFIC_NAME` FROM `INFORMATION_SCHEMA`.`ROUTINES` WHERE `ROUTINE_SCHEMA` = 'database_name' COLLATE utf8_bin AND ROUTINE_TYPE = 'PROCEDURE';
如果lower_case_table_names系统变量设置为0,我强制使用utf8_bin作为要使用的排序规则以获得正确的结果。
但是如果lower_case_table_names设置为2并且数据库名称具有大写字符,则我使用相同的查询获得空结果集。
此外,如果在具有不区分大小写的文件名的系统上将lower_case_table_names设置为0,那么我将获得带有查询的空结果集。
在这两种情况下,如果从查询中删除“COLLATE utf8_bin”或替换为“COLLATE utf8_general_ci”,我将获得正确的结果集。
引自:http://dev.mysql.com/doc/refman/5.6/en/identifier-case-sensitivity.html
0
表和数据库名称使用lettercase存储在磁盘上 在CREATE TABLE或CREATE DATABASE语句中指定。名称 比较区分大小写。您不应将此变量设置为0 如果您在具有不区分大小写的文件的系统上运行MySQL 名称(例如Windows或Mac OS X)。如果强制此变量为0 在不区分大小写的文件系统上使用--lower-case-table-names = 0和 使用不同的字母表访问MyISAM表名,索引损坏 可能会导致。1
表名以小写形式存储在磁盘上,名称比较为 不区分大小写。 MySQL将所有表名转换为小写 存储和查找。此行为也适用于数据库名称和 表别名。2
表和数据库名称使用lettercase存储在磁盘上 在CREATE TABLE或CREATE DATABASE语句中指定,但是MySQL 在查找时将它们转换为小写。名称比较不是案例 敏感。这仅适用于非大小写的文件系统 敏感! InnoDB表名以小写形式存储,如下所示 的lower_case_table_names = 1。
如果lower_case_table_names设置为2
“MySQL在查找时将它们转换为小写”
这是什么意思?
我知道在Windows / OS X上不能将lower_case_table_names设置为0,但我无法控制查询将要运行的环境。
但我发现这种行为很奇怪。
INFORMATION_SCHEMA.EVENTS上的SELECT行为也相同。
的更新 的
如果lower_case_table_names = 2,或者windows中的lower_case_table_names = 0,则INFORMATION_SCHEMA.ROUTINES表中ROUTINE_SCHEMA列中的值为小写。但是INFORMATION_SCHEMA.TABLES中的ROUTINE_SCHEMA列具有与创建数据库时使用的字母大小写相同的值。甚至SHOW DATABASES的结果集也具有与创建数据库时使用的相同字母大小写的值。为何如此区别?
答案 0 :(得分:1)
lower_case_table_names
的值会影响两件事:
用于存储在磁盘上的数据文件名称的字母;以及
SQL命令中模式对象标识符的隐式转换。
您的问题是,在查询INFORMATION_SCHEMA
时,唯一的架构对象标识符是对INFORMATION_SCHEMA
本身的引用(在您的查询中,ROUTINES
表及其列名称)。对您的架构对象的引用(例如ROUTINE_SCHEMA
列中的值和您的'database_name'
文字等)不是架构对象标识符,而是普通的字符串(根据lower_case_table_names
系统变量,不会受益于MySQL的隐式字母转换)。
因此,对于lower_case_table_names = 2
,您的数据库使用INFORMATION_SCHEMA
命令中使用的字母大写存储在磁盘上(并在CREATE DATABASE
中)。如果在查询INFORMATION_SCHEMA
时使用区分大小写的排序规则,则查找将失败(除非您使用与创建数据库时使用的相同的字母大小写)。解决方案显然是使用不区分大小写的排序规则,例如utf8_general_ci
。