想知道这两种数据类型将占用多少实际存储空间,因为关于此问题的MySQL文档尚不清楚。
在我看来,这似乎意味着,给定utf8编码的数据库,CHAR将始终每个字符占用32位,而VARCHAR则将占用8到32之间,具体取决于所存储字符的实际字节长度。那是对的吗?还是VARCHAR隐含8位字符宽度,并且存储多字节的UTF8字符实际上消耗了VARCHAR中的多个“字符”?还是VARCHAR是否也总是每个字符存储32位?如此多的可能性。
以前,我不必担心太多,但我已经开始达到内存中临时表的大小限制,而且我不一定要(第二次)增加MySQL的可用池。
最佳答案
CHAR
和VARCHAR
都计算字符。在给定字符编码和长度的情况下,它们两个都计算可能需要的最大存储量。对于ASCII,每个字符1个字节。对于UTF-8,每个字符3个字节(不是您所期望的4个字节,因为MySQL's Unicode support is crippled由于某种原因,并且不支持任何Unicode字符,而Unicode字符在UTF-8中需要4个字节)。到目前为止,CHAR
和VARCHAR
是相同的。
现在,CHAR
继续进行并保留此存储量。VARCHAR
而是分配1或2个字节,具体取决于此最大存储量是
有趣的是,这使85成为UTF-8 VARCHAR
的魔魔数(Magic Number)字:
VARCHAR(85)
使用1个字节作为长度,因为最大可能的85个(残缺的)UTF-8字符长度为3×85 =255。VARCHAR(86)
使用2个字节作为长度,因为86(残缺的)UTF-8字符的最大可能长度为3×86 =258。