基于lower_case_table_names系统变量的SELECT对information_schema.routines的行为

时间:2014-01-10 08:16:14

标签: mysql database-schema collation

这是我用来获取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的结果集也具有与创建数据库时使用的相同字母大小写的值。为何如此区别?

1 个答案:

答案 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