【问题标题】:MySQL char & varchar character sets & storage sizesMySQL char & varchar 字符集 & 存储大小
【发布时间】:2012-04-22 07:34:18
【问题描述】:

想知道这两种数据类型将占用多少实际存储空间,因为 MySQL 文档对此事有些不清楚。

CHAR(M) M × w 字节,0

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

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

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

【问题讨论】:

    标签: mysql character-encoding sqldatatypes


    【解决方案1】:

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

    现在,CHAR 继续保留此数量的存储空间。

    VARCHAR 而是分配了 1 或 2 个字节,这取决于这个最大存储是

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

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

    【讨论】:

    • 补充一点,MySQL 的utf8 存储不仅残缺不全,也不是标准的 UTF-8。 utf8 编码字符串的存储大约是常规 UTF-8 编码字符串的两倍,因此效率更低。
    • @deceze 我没有意识到这一点。您对此有任何详细信息或参考吗?
    • 我希望我这样做了,但文档并没有说太多。最近有一个关于转储数据库的问题,其中数据以二进制原样转储,这是非常明显的。
    • 看起来比这更复杂。例如,InnoDB has two different row formatsCOMPACTREDUNDANT)因此一行占用的空间取决于正在使用的空间。它不再像以前那样简单,当时唯一常用的存储引擎是 MyISAM。无论如何,1字节的差异无论如何都可以忽略不计。您更有可能关心 InnoDB 中键的最大长度,即 768 字节。因此 UTF-8 VARCHAR(256) 不能成为键的一部分。一个 UTF-8 VARCHAR(255) 字段可以是一个键。
    • 啊,情节变厚了..很高兴知道。我还注意到在更高版本的 MySQL 中提供了一个“utf8mb4”字符集,这是对他们之前一直使用的 gimped utf8 字符集的修复。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-10-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-08
    • 2012-08-19
    • 1970-01-01
    相关资源
    最近更新 更多