• 首页
  • vue
  • TypeScript
  • JavaScript
  • scss
  • css3
  • html5
  • php
  • MySQL
  • redis
  • jQuery
  • 标识符区分大小写

    在MySQL中,数据库与data目录中的目录相对应。数据库中的每个表都对应于数据库目录中的至少一个文件(可能还有更多文件,具体取决于存储引擎)。触发器也对应于文件。因此,基础操作系统的区分大小写在数据库,表和触发器名称的区分大小写中起作用。这意味着这些名称在Windows中不区分大小写,但在大多数Unix版本中都区分大小写。macOS是一个值得注意的例外,它是基于Unix的,但使用的是不区分大小写的默认文件系统类型(HFS +)。但是,macOS也支持UFS卷,这与任何Unix一样都区分大小写。看到“ MySQL对标准SQL的扩展”。所述lower_case_table_names系统变量也影响服务器把手如何识别符的情况下的灵敏度,如在本节后面说明。

    注意

    尽管数据库,表和触发器名称在某些平台上不区分大小写,但您不应在同一语句中使用不同的大小写形式引用其中之一。以下语句将不起作用,因为它同时引用as my_table和as 的表MY_TABLE

    mysql> SELECT * FROM my_table WHERE MY_TABLE.col=1;
    

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

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

    默认情况下,表别名在Unix上区分大小写,但在Windows或macOS上不区分大小写。以下语句在Unix上不起作用,因为它同时引用了as 和as 别名A

    mysql> SELECT col_name FROM tbl_name AS a
           WHERE  .col_name = 1 OR A.col_name = 2;
    

    但是,在Windows上允许使用相同的语句。为了避免由此类差异引起的问题,最好采用一致的约定,例如始终使用小写名称创建和引用数据库和表。建议使用此约定,以实现最大的可移植性和易用性。

    表和数据库名称如何存储在磁盘上以及如何在MySQL中使用受lower_case_table_names系统变量影响。lower_case_table_names可以采用下表中显示的值。这个变量不影响触发标识符的情况下的灵敏度。在Unix上,默认值为lower_case_table_names0。在Windows上,默认值为1。在macOS上,默认值为2。

    lower_case_table_names只能在初始化服务器时配置。lower_case_table_names禁止在服务器初始化后更改设置。

    含义
    0表和数据库名称使用CREATE TABLEor CREATE DATABASE语句中指定的字母大小写存储在磁盘上。名称比较区分大小写。你应该不会,如果你有不区分大小写的文件名(如Windows或Mac系统)的系统上运行MySQL这个变量设置为0。如果--lower-case-table-names=0在不区分大小写的文件系统上强制将此变量设置为0 并MyISAM使用不同的字母大小写访问表名,则可能导致索引损坏。
    1表名以小写形式存储在磁盘上,名称比较不区分大小写。MySQL在存储和查找时将所有表名都转换为小写。此行为也适用于数据库名称和表别名。
    2表名和数据库名使用CREATE TABLEor CREATE DATABASE语句中指定的字母大小写存储在磁盘上,但是MySQL在查找时将它们转换为小写。名称比较不区分大小写。这仅适用于不区分大小写的文件系统!InnoDB表名和视图名与一样以小写形式存储lower_case_table_names=1

    如果仅在一个平台上使用MySQL,通常不必使用lower_case_table_names默认设置以外的其他设置。但是,如果要在文件系统区分大小写的平台之间传输表,可能会遇到困难。例如,在Unix上,可以有两个不同的表,分别命名为my_tableMY_TABLE,但是在Windows上,这两个名称被认为是相同的。为避免数据库或表名的字母大写引起的数据传输问题,您有两种选择:

    • lower_case_table_names=1在所有系统上使用。这样做的主要缺点是,当您使用SHOW TABLES或时SHOW DATABASES,您不会在其原始字母大小写中看到名称。
    • 使用lower_case_table_names=0在Unix和lower_case_table_names=2Windows上。这样可以保留数据库名称和表名称的字母大小写。这样做的缺点是,必须确保您的语句在Windows上始终以正确的字母大小写引用数据库和表名。如果将语句转移到字母大写的Unix,则如果字母大写不正确,则它们将不起作用。

      例外:如果您使用InnoDB表,并且试图避免这些数据传输问题,则应lower_case_table_names=1在所有平台上使用将名称强制转换为小写形式。

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

    文件系统区分大小写会影响在表的字符串列中的搜索INFORMATION_SCHEMA。有关更多信息,请参见“在INFORMATION_SCHEMA搜索中使用归类”。