相关的文档10bet官方网站 本手册下载 本手册节选

9.2.3标识符区分大小写

在MySQL中,数据库对应于数据目录中的目录。数据库中的每个表至少对应于数据库目录中的一个文件(可能更多,取决于存储引擎)。触发器也对应于文件。因此,底层操作系统的大小写敏感性在数据库、表和触发器名称的大小写敏感性中起着一定的作用。这意味着这些名称在Windows中不区分大小写,但在大多数Unix中都是区分大小写的。一个值得注意的例外是macOS,它是基于unix的,但使用了不区分大小写的默认文件系统类型(HFS+)。但是,macOS也支持UFS卷,与任何Unix一样,UFS卷是区分大小写的。看到第1.7.1节,“标准SQL的MySQL扩展”.的lower_case_table_names系统变量还会影响服务器处理标识符大小写敏感性的方式,本节稍后将对此进行描述。

请注意

尽管数据库、表和触发器名称在某些平台上不区分大小写,但您不应该在同一语句中使用不同的大小写引用它们。下面的语句不起作用,因为它同时引用了一个表my_tableMY_TABLE

mysql> SELECT * FROM my_table .col=1;

分区、子分区、列、索引、存储例程、事件和资源组名称在任何平台上都不区分大小写,列别名也不区分大小写。

但是,日志文件组的名称是区分大小写的。这与标准SQL不同。

默认情况下,表别名在Unix上是区分大小写的,但在Windows或macOS上不是这样。下面的语句在Unix上不起作用,因为它引用的别名是一个一个

mysql >选择col_nametbl_name作为一个地方;col_name= 1或a。col_name= 2;

然而,同样的语句在Windows上是允许的。为了避免这种差异造成的问题,最好采用一致的约定,例如始终使用小写名称创建和引用数据库和表。建议使用此约定以最大限度地实现可移植性和易用性。

如何将表和数据库名称存储在磁盘上并在MySQL中使用lower_case_table_names系统变量。lower_case_table_names可以取下表中所示的值。这个变量是影响触发器标识符的大小写敏感性。在Unix上,的默认值lower_case_table_names是0。在Windows操作系统下,默认值为1。在macOS上,默认值是2。

lower_case_table_names只能在初始化服务器时配置。改变了lower_case_table_names禁止初始化服务器后进行设置。

价值 意义
0 中指定的字母将表名和数据库名存储在磁盘上创建表创建数据库声明。名称比较区分大小写。你应该如果在不区分大小写的文件名(如Windows或macOS)的系统上运行MySQL,请将此变量设置为0。如果强制这个变量为0——lower-case-table-names = 0对不区分大小写的文件系统进行访问MyISAM表名使用不同的字母大小写,可能导致索引损坏。
1 在磁盘上,表名以小写形式存储,名称比较不区分大小写。MySQL在存储和查找时将所有表名转换为小写。这种行为也适用于数据库名称和表别名。
2 中指定的字母将表名和数据库名存储在磁盘上创建表创建数据库但是MySQL在查找时将它们转换为小写字母。名称比较不区分大小写。这是只有在不区分大小写的文件系统上!InnoDB表名和视图名以小写形式存储lower_case_table_names = 1

如果你只在一个平台上使用MySQL,你通常不需要使用lower_case_table_names设置非默认值。但是,如果希望在文件系统大小写敏感性不同的平台之间传输表,可能会遇到困难。例如,在Unix上,可以有两个不同的表my_table而且MY_TABLE,但在Windows上,这两个名称被认为是相同的。为了避免因数据库或表名的大小写而引起的数据传输问题,您有两种选择:

  • 使用lower_case_table_names = 1在所有系统。这个的主要缺点是当你使用显示表显示数据库,你看不到名字的原始字母。

  • 使用lower_case_table_names = 0在Unix和lower_case_table_names = 2在Windows上。这将保留数据库和表名称的大小写。这样做的缺点是,您必须确保您的语句在Windows上总是以正确的字母大小写引用数据库和表名。如果您将语句转移到Unix,其中字母是重要的,如果字母不正确,它们将无法工作。

    异常:如果你正在使用InnoDB表和您要尽量避免这些数据传输问题,您应该使用lower_case_table_names = 1在所有平台上强制名称转换为小写。

如果根据二进制排序规则,对象名称的大写形式相同,则可以认为它们是重复的。游标、条件、过程、函数、保存点、存储的例程参数、存储的程序局部变量和插件的名称都是如此。对于列名、约束名、数据库名、分区名、用准备的语句名则不成立准备、表、触发器、用户和用户定义变量。

文件系统的大小写敏感性会影响字符串列中的搜索INFORMATION_SCHEMA表。有关更多信息,请参见第10.8.7节,“在INFORMATION_SCHEMA搜索中使用排序规则”