Indexing InnoDB是否在索引中以扩展形式存储多字节字符串?
InnoDB是否在索引中以扩展形式存储多字节字符串 例如,每个Indexing InnoDB是否在索引中以扩展形式存储多字节字符串?,indexing,utf-8,innodb,multibyte,utf8mb4,Indexing,Utf 8,Innodb,Multibyte,Utf8mb4,InnoDB是否在索引中以扩展形式存储多字节字符串 例如,每个utf8mb4字符串是否需要4个字节 我试着从信息\u模式.tables.index\u长度进行经验测试,但是,该值不是确定性的,因此它不是一种可靠的方法。我在文档中也找不到这个概念 编辑:为了澄清,问题是,简而言之:在CHAR(1)NOT NULL列(不考虑索引元数据)上的InnoDB索引中存储一个1字节utf8mb4字符(例如,U+0050)需要多少字节?utf8字符串中的所有字符都存储为可变长度编码。根据其代码点,每个字符使用1
utf8mb4
字符串是否需要4个字节
我试着从信息\u模式.tables.index\u长度
进行经验测试,但是,该值不是确定性的,因此它不是一种可靠的方法。我在文档中也找不到这个概念
编辑:为了澄清,问题是,简而言之:在
CHAR(1)NOT NULL
列(不考虑索引元数据)上的InnoDB索引中存储一个1字节utf8mb4字符(例如,U+0050
)需要多少字节?utf8字符串中的所有字符都存储为可变长度编码。根据其代码点,每个字符使用1、2、3或4个字节。字符串可以混合编码,因为每个代码点在每个字节的初始位中标识其长度
ASCII子集中的字符将仅使用1个字节。utf8字符串中的所有字符都存储为可变长度编码。根据其代码点,每个字符使用1、2、3或4个字节。字符串可以混合编码,因为每个代码点在每个字节的初始位中标识其长度
ASCII子集中的字符将仅使用1个字节。例如,每个utf8mb4字符串字符是否需要4个字节?--每个字符最多占用4个字节 您可以使用
LENGTH(col)
查找列中的字节数。您可以使用
CHAR\u LENGTH(col)
查找列中的字符数
这两个数字的比例将介于1:1和4:1之间。英语将是1:1;西欧:1:1至2:1之间;俄语和希腊语将是2:1;大多数亚洲语言将是3:1;带有表情符号的字符串可能接近4:1
除非进行编码,否则在MySQL表中找不到6个字符“U+0050”。不要那样做
information\u schema.tables.index\u length
表示所有辅助索引使用了多少空间。这与您的问题无关的原因有很多——B树开销、块开销、行开销、列开销、指向子节点的指针等等。例如,每个utf8mb4字符串是否占用4个字节?--每个字符最多占用4个字节
您可以使用LENGTH(col)
查找列中的字节数。您可以使用
CHAR\u LENGTH(col)
查找列中的字符数
这两个数字的比例将介于1:1和4:1之间。英语将是1:1;西欧:1:1至2:1之间;俄语和希腊语将是2:1;大多数亚洲语言将是3:1;带有表情符号的字符串可能接近4:1
除非进行编码,否则在MySQL表中找不到6个字符“U+0050”。不要那样做
information\u schema.tables.index\u length
表示所有辅助索引使用了多少空间。这与您的问题无关的原因有很多——B树开销、块开销、行开销、列开销、指向子节点的指针等等。这个答案通常指UTF-8(而不是InnoDB utf8mb4),因此值得指出,@Marcus,UTF-8不允许将代码点编码为任何可以称为“扩展形式”的东西。它只允许一个代码点的一个字节序列表示。是的,我同意。需要明确的是,Tom所说的是每个代码点都有一个表示,而不是表示使用一个字节。:)好的,那么,为了澄清这个问题-在CHAR(1)NOT NULL
列(不考虑索引元数据)的InnoDB索引中存储一个1字节utf8mb4字符(比如,U+0050
)需要多少字节?一个单字节字符存储在一个字节中。这个答案通常指的是UTF-8(而不是InnoDB utf8mb4)所以值得指出的是,@Marcus,UTF-8不允许将代码点编码为任何可以称为“扩展形式”的东西。它只允许一个代码点的一个字节序列表示。是的,我同意。需要明确的是,Tom所说的是每个代码点都有一个表示,而不是表示使用一个字节。:)好的,那么,为了澄清这个问题-在CHAR(1)NOT NULL
列(不考虑索引元数据)上的InnoDB索引中存储一个1字节utf8mb4字符(比如,U+0050
)需要多少字节?一个单字节字符存储在一个字节中。