MySQL 8.4 Reference Manual  /  ...  /  Mapping of Identifiers to File Names

11.2.4 标识符到文件名的映射

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

对于数据和索引文件,磁盘上的确切表示形式是存储引擎特定的。这些文件可能存储在数据库目录中,也可能存储在单独的文件中。InnoDB 数据存储在 InnoDB 数据文件中。如果您使用的是 InnoDB 表空间,则创建的特定表空间文件将被用于代替。

任何字符都可以用作数据库或表标识符,除了 ASCII NUL (X'00')。MySQL 在创建数据库目录或表文件时,对于可能在对应文件系统对象中的问题字符进行编码:

  • 基本拉丁字母(a..zA..Z)、数字(0..9) 和下划线(_)将被编码为是。因此,他们的大小写敏感性直接取决于文件系统特征。

  • 所有其他国家字母,从具有大写/小写映射的字母表中,编码如下表所示。Code Range 列中的值是 UCS-2 值。

    Code Range Pattern Number Used Unused Blocks
    00C0..017F [@][0..4][g..z] 5*20= 100 97 3 Latin-1 Supplement + Latin Extended-A
    0370..03FF [@][5..9][g..z] 5*20= 100 88 12 Greek and Coptic
    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,在服务器创建相应的文件或目录时会被编码为追加@@@到名称。这在所有平台上都发生,以便在平台之间移植相应的数据库对象。

以下名称是保留的,如果用于 schema 或 table 名称,会被追加@@@:

  • CON

  • PRN

  • AUX

  • NUL

  • COM1 到 COM9

  • LPT1 到 LPT9

CLOCK$ 也是一种保留名称,但不是追加@@@,而是追加@0024。也就是说,如果 CLOCK$ 用于 schema 或 table 名称,它将被写入文件系统中为CLOCK@0024。类似地,对于任何使用美元符号 ($) 在 schema 或 table 名称中的情况,它将被替换为@0024在文件系统中。

Note

这些名称也写入到INNODB_TABLES中,以其附加形式写入,但在TABLES中,以用户输入的未附加形式写入。