mysql - 基于 lower_case_table_names 系统变量的 information_schema.routines 上的 SELECT 行为

标签 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
    Table and database names are stored on disk using the lettercase specified in the CREATE TABLE or CREATE DATABASE statement. Name comparisons are case sensitive. You should not set this variable to 0 if you are running MySQL on a system that has case-insensitive file names (such as Windows or Mac OS X). If you force this variable to 0 with --lower-case-table-names=0 on a case-insensitive file system and access MyISAM tablenames using different lettercases, index corruption may result.

  • 1
    Table names are stored in lowercase on disk and name comparisons are not case sensitive. MySQL converts all table names to lowercase on storage and lookup. This behavior also applies to database names and table aliases.

  • 2
    Table and database names are stored on disk using the lettercase specified in the CREATE TABLE or CREATE DATABASE statement, but MySQL converts them to lowercase on lookup. Name comparisons are not case sensitive. This works only on file systems that are not case sensitive! InnoDB table names are stored in lowercase, as for lower_case_table_names=1.

如果 lower_case_table_names 设置为 2

"MySQL converts them to lowercase on lookup"

这是什么意思?

我知道 lower_case_table_names 在 Windows/OS X 上不能设置为 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 的结果集也具有与创建数据库时使用的字母大小写相同的值。为什么会有这种差异?

最佳答案

lower_case_table_names 的值影响两件事:

  • 用于存储在磁盘上的数据文件名称的字母大小写;和

  • SQL 命令中模式对象标识符的隐式转换。

您的问题是,在查询 INFORMATION_SCHEMA 时,唯一的架构对象标识符是对 INFORMATION_SCHEMA 本身的引用(在您的查询中,ROUTINES 表及其列 names)。对您的 架构对象的引用(例如 ROUTINE_SCHEMA 列中的 和您的'database_name' 文字等)是不是模式对象标识符,而是普通字符串(根据 lower_case_table_names 系统变量,它不会从 MySQL 的隐式字母大小写转换中受益)。

因此,使用 lower_case_table_names = 2,您的数据库将使用 CREATE DATABASE< 中使用的字母大小写存储在磁盘上(以及 INFORMATION_SCHEMA)/命令。如果您在查询 INFORMATION_SCHEMA 时使用区分大小写的排序规则,则查找将失败是可以理解的(除非您使用与创建数据库时相同的字母大小写)。解决方案显然是使用不区分大小写的排序规则,例如 utf8_general_ci

关于mysql - 基于 lower_case_table_names 系统变量的 information_schema.routines 上的 SELECT 行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21039144/

相关文章:

php - 如何更新数据库中数组的值

mysql - CakePHP - 连接表后对数据进行分页

postgresql - 在 PostgreSQL 中使用 dblink 时如何包含模式 inf?

database-design - SaaS 数据库设计 - 多个数据库? split ?

MySQL 按带数字的字符串排序

php - Swift 3 - 从 mySQL 数据库中提取图像

mysql - XAMPP 文件夹中 MySQL 数据库表的确切位置是什么?

SQL Azure架构升级策略

mysql - 如何找出 MySQL 中的默认字符集/排序规则

MySQL 使用 utf8_general_ci 对 Ä 和 Ö 进行排序