MySQL char& varchar字符集&存储大小

时间:2012-04-10 00:19:22

标签: mysql character-encoding sqldatatypes

想知道这两种数据类型会占用多少实际存储空间,因为MySQL文档在这个问题上有点不清楚。

  

CHAR(M)M×w字节,0 <= M <= 255,其中w是字节数   字符集中最大长度字符所需的

     

VARCHAR(M),VARBINARY(M)如果列值需要0 - 255,则L + 1个字节   如果值可能需要超过255个字节,则为字节,L + 2个字节

这似乎意味着,给定一个utf8编码的数据库,CHAR将始终占用每个字符32位,而VARCHAR将占用8到32之间,具体取决于存储的字符的实际字节长度。那是对的吗?或者VARCHAR是否意味着8位字符宽度,并且存储多个八位字节的UTF8字符实际上会消耗VARCHAR中的多个“字符”?或者VARCHAR是否也始终每个字符存储32位?这么多的可能性。

以前我不必担心这个问题,但是我开始遇到内存临时表大小限制,我不一定要增加MySQL的可用池(第二次) )。

1 个答案:

答案 0 :(得分:9)

CHARVARCHAR都计算字符数。它们都计算了给定字符编码和长度时可能需要的最大存储空间。对于ASCII,每个字符为1个字节。对于UTF-8,这是每个字符3个字节(不是你期望的4个字节,因为MySQL's Unicode support is crippled由于某种原因,并且它不支持UTF-8中需要4个字节的任何Unicode字符)。到目前为止,CHARVARCHAR是相同的。

现在,CHAR只是继续保留这个存储空间。

VARCHAR改为分配1或2个字节,具体取决于此最大存储量是否为&lt; 256或≥256。条目占用的实际空间量是这一个或两个字节,再加上字符串实际占用的空间量。

有趣的是,这使得85为UTF-8 VARCHAR的神奇数字:

  • VARCHAR(85)使用1个字节作为长度,因为最大可能长度为85(残缺的)UTF-8字符为3×85 = 255。
  • VARCHAR(86)使用2个字节作为长度,因为最大可能长度为86(残缺的)UTF-8字符为3×86 = 258。