MySQL TEXT 列的存储要求

MySQL TEXT 列的存储要求

我有一个名为errormsg2MyISAM 存储引擎的 MySQL 表,其中有大约十几列。

我估计其中两列占据了每行使用的大部分空间,并且它们的数据类型为 TEXT。它们是backtracemsg

我试图估计每行所需的存储量,但遇到了以下矛盾:

show table status where name = 'errormsg2';显示(data_length + index_length) / rows每行大约有 778 个字节。

select avg( bit_length( em.backtrace ) + bit_length( em.msg ) ) / 8 from errormsg2 em;显示仅这两列每行平均有 899 个字节的文本。

表格存储的数据怎么可能比它使用的数据多呢?我遗漏了什么?

答案1

需要考虑的一件事是编码问题。例如,UTF-8 对某些字符使用 5 个字节。如果您没有数据或可变数据,数据库将被迫假设最坏的情况:每个字符的长度可能是 5 个字节。因此,它可能会分配比实际需要更多的空间。

请注意,尽管 UTF-16 据称只有 2 个字节,但它也可能存在同样的问题:它必须对 4 个字节长的代理对进行编码。UTF-16 还存在其他多个问题,并且一些主张始终使用 UTF-8

相关内容