MySQL 9.0 参考手册  /  ...  /  标识符到文件名映射

11.2.4 标识符到文件名映射

数据库和表标识符与文件系统中的名称之间存在对应关系。对于基本结构,MySQL 将每个数据库表示为数据目录中的一个目录,并且根据存储引擎,每个表可能由相应数据库目录中的一个或多个文件表示。

对于数据文件和索引文件,磁盘上的确切表示方式是特定于存储引擎的。这些文件可能存储在数据库目录中,或者信息可能存储在单独的文件中。 InnoDB 数据存储在 InnoDB 数据文件中。如果您使用的是带有 InnoDB 的表空间,那么将使用您创建的特定表空间文件。

在数据库或表标识符中,除 ASCII NUL (X'00') 之外,任何字符都是合法的。MySQL 在创建数据库目录或表文件时,会对相应文件系统对象中存在问题的任何字符进行编码。

  • 基本拉丁字母 (a..zA..Z)、数字 (0..9) 和下划线 (_) 按原样编码。因此,它们的大小写敏感性直接取决于文件系统功能。

  • 所有其他具有大写/小写映射的字母表的国家字母按照下表所示进行编码。代码范围列中的值是 UCS-2 值。

    代码范围 模式 号码 已使用 未使用
    00C0..017F [@][0..4][g..z] 5*20= 100 97 3 拉丁字母 1 补充 + 拉丁字母扩展 A
    0370..03FF [@][5..9][g..z] 5*20= 100 88 12 希腊语和科普特语
    0400..052F [@][g..z][0..6] 20*7= 140 137 3 西里尔字母 + 西里尔字母补充
    0530..058F [@][g..z][7..8] 20*2= 40 38 2 亚美尼亚语
    2160..217F [@][g..z][9] 20*1= 20 16 4 数字形式
    0180..02AF [@][g..z][a..k] 20*11=220 203 17 拉丁字母扩展 B + IPA 扩展
    1E00..1EFF [@][g..z][l..r] 20*7= 140 136 4 拉丁字母扩展附加
    1F00..1FFF [@][g..z][s..z] 20*8= 160 144 16 希腊语扩展
    .... .... [@][a..f][g..z] 6*20= 120 0 120 保留
    24B6..24E9 [@][@][a..z] 26 26 0 封闭的字母数字
    FF21..FF5A [@][a..z][@] 26 26 0 半角和全角形式

    序列中的一个字节编码字母大小写。例如: LATIN CAPITAL LETTER A WITH GRAVE 编码为 @0G,而 LATIN SMALL LETTER A WITH GRAVE 编码为 @0g。这里第三个字节 (Gg) 表示字母大小写。(在大小写不敏感的文件系统上,这两个字母被视为相同。)

    对于某些块,例如西里尔字母,第二个字节决定字母大小写。对于其他块,例如拉丁字母 1 补充,第三个字节决定字母大小写。如果序列中的两个字节是字母(如希腊语扩展),则最左侧的字母字符表示字母大小写。所有其他字母字节必须为小写。

  • 除下划线 (_) 之外,所有非字母字符,以及没有大写/小写映射的字母表的字母(例如希伯来语)都使用十六进制表示法进行编码,使用小写字母表示十六进制数字 a..f

    0x003F -> @003f
    0xFFFF -> @ffff

    十六进制值对应于 ucs2 双字节字符集中的字符值。

在 Windows 上,某些名称(如 nulprnaux)在服务器创建相应的文件或目录时,会在名称末尾附加 @@@。这种情况发生在所有平台上,是为了保证相应数据库对象在平台之间可移植性。

以下名称是保留名称,如果在模式或表名中使用,则会在末尾附加 @@@

  • CON

  • PRN

  • AUX

  • NUL

  • COM1 到 COM9

  • LPT1 到 LPT9

CLOCK$ 也是这组保留名称的成员,但不会附加 @@@,而是附加 @0024。也就是说,如果 CLOCK$ 用作模式或表名,则将其写入文件系统为 CLOCK@0024。对于在模式或表名中使用的任何 $(美元符号)也是如此;它将被替换为文件系统上的 @0024

注意

这些名称也被写入 INNODB_TABLES 中的附加形式,但被写入 TABLES 中的未附加形式,如用户输入所示。