InnoDB 是否以扩展形式在索引中存储多字节字符串?
Does InnoDB stores multibyte strings in expanded form, in indexes?
InnoDB 是否在索引中以扩展形式存储多字节字符串?
例如,每个 utf8mb4
字符串占用 4 个字节吗?
我已经尝试从 information_schema.tables.index_length
开始对此进行经验测试,但是,该值不是确定性的,因此它不是可靠的方法。我在文档中也找不到这个概念。
编辑:澄清一下,简而言之,问题是:在 CHAR(1) NOT NULL
列(不考虑索引元数据)?
utf8 字符串中的所有字符都存储为 variable-length 编码。每个字符根据其代码点使用 1、2、3 或 4 个字节。字符串可以混合使用多种编码,因为每个代码点在每个字节的初始位中标识其长度。
ASCII 子集中的字符将只使用 1 个字节。
例如,每个utf8mb4 string character是否占用4个字节? -- 每个字符需要最多 4个字节。
您可以使用 LENGTH(col)
来计算列中 字节 的数量。
您可以使用 CHAR_LENGTH(col)
来计算列中 个字符 的数量。
这两个数字的比率介于 1:1 和 4:1 之间。英语将是1:1;西欧:在 1:1 和 2:1 之间;俄语和希腊语将 2:1;大多数亚洲语言将是 3:1;带有表情符号的字符串可能接近 4:1.
你不会在 MySQL 表中找到 6 个字符 "U+0050",除非你经过一些编码。不要那样做。
information_schema.tables.index_length
表示所有二级索引用了多少space。有 许多 原因导致这与您的问题无关——BTree 开销、块开销、行开销、列开销、指向 sub-nodes 的指针等。
InnoDB 是否在索引中以扩展形式存储多字节字符串?
例如,每个 utf8mb4
字符串占用 4 个字节吗?
我已经尝试从 information_schema.tables.index_length
开始对此进行经验测试,但是,该值不是确定性的,因此它不是可靠的方法。我在文档中也找不到这个概念。
编辑:澄清一下,简而言之,问题是:在 CHAR(1) NOT NULL
列(不考虑索引元数据)?
utf8 字符串中的所有字符都存储为 variable-length 编码。每个字符根据其代码点使用 1、2、3 或 4 个字节。字符串可以混合使用多种编码,因为每个代码点在每个字节的初始位中标识其长度。
ASCII 子集中的字符将只使用 1 个字节。
例如,每个utf8mb4 string character是否占用4个字节? -- 每个字符需要最多 4个字节。
您可以使用 LENGTH(col)
来计算列中 字节 的数量。
您可以使用 CHAR_LENGTH(col)
来计算列中 个字符 的数量。
这两个数字的比率介于 1:1 和 4:1 之间。英语将是1:1;西欧:在 1:1 和 2:1 之间;俄语和希腊语将 2:1;大多数亚洲语言将是 3:1;带有表情符号的字符串可能接近 4:1.
你不会在 MySQL 表中找到 6 个字符 "U+0050",除非你经过一些编码。不要那样做。
information_schema.tables.index_length
表示所有二级索引用了多少space。有 许多 原因导致这与您的问题无关——BTree 开销、块开销、行开销、列开销、指向 sub-nodes 的指针等。