想知道这两种数据类型实际占用的存储空间有多少,因为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的可用池(第二次)。
utf8
存储不仅受到了限制,而且它也不是标准的UTF-8。使用utf8
编码的字符串存储需要大约两倍于常规UTF-8编码字符串的存储空间,使其更加低效。 - decezeCOMPACT
和REDUNDANT
),因此一行占用的空间取决于哪种正在使用。当只有 MyISAM 这个存储引擎通常被使用时,情况已不再像以前那么简单了。无论如何,1 个字节的区别是微不足道的。你更可能关心的是 InnoDB 中键的最大长度,它为 768 个字节。因此,UTF-8 VARCHAR(256) 不能成为键的一部分。UTF-8 VARCHAR(255) 字段 可以 成为键。 - Celada