【问题标题】:mysql varchar byte length 255 issuemysql varchar 字节长度 255 问题
【发布时间】:2011-05-31 04:02:22
【问题描述】:

根据mysql文档:

如果值需要不超过 255 个字节,则一列使用一个长度字节, 如果值可能需要两个长度字节 超过 255 个字节

最大行大小限制 列数,因为总 所有列的宽度不能超过 这个尺寸。例如,utf8 字符最多需要 三个字节 每个字符,所以对于 CHAR(255) CHARACTER SET utf8 列,服务器 每个必须分配 255 × 3 = 765 字节 价值。因此,表不能 包含超过 65,535 / 765 = 85 这样的列。

为了清楚起见,我可以在 varchar 参数中设置的 ma​​ximum 值是多少,因此它只使用 1 个字节来存储其长度?

【问题讨论】:

    标签: mysql


    【解决方案1】:

    来自the MySQL documentation

    CHAR 和 VARCHAR 类型是 声明的长度表示 字符的最大数量 想要存储。例如,CHAR(30) 最多可容纳 30 个字符。

    [VARCHAR] 列使用一种长度 字节,如果值要求不超过 255 字节,如果是两个长度字节 值可能需要超过 255 字节

    这使您的问题的答案取决于字符编码。

    使用像 windows-1252(MySQL 称为 latin1)这样的单字节编码,字符长度与字节长度相同,因此您可以使用 VARCHAR(255)

    对于 UTF-8,VARCHAR(N) 可能需要多达 3N 个字节,如果所有字符都在 U+0800 到 U+FFFF 范围内,情况就是这样。因此,VARCHAR(85) 是确保单字节字节长度的最大参数(最多需要 255 个字节)。

    (注意 MySQL 显然不支持 BMP 以外的字符。UTF-8 的官方定义允许每个字符 4 个字节。)

    【讨论】:

    • 谁不知道:BMP 的意思是“基本的多语言平面”。它应该可以满足所有需求(甚至涵盖 CJK),除非您需要古代文字或花哨的符号。
    • 一长字节是什么意思?我明白什么是一字节,但什么是一长字节?
    • @vigamage:“长度字节”是用于存储字符串长度的字节(与字符串的内容分开)。有一个长度字节意味着字符串最多可以有 255 个字节长,有两个长度字节意味着字符串最多可以有 65535 个字节长,等等。
    【解决方案2】:

    为了清楚起见,我可以在 varchar 参数中设置的最大值是多少,所以它只使用 1 个字节来存储它的长度?

    这取决于VARCHAR 列的排序规则。

    如您所述,UTF8可能每个字符最多使用三个字节,因此如果您声明的 UTF8 列超过 85 个字符,则它有可能会使用超过255 个字节来存储其数据,因此长度应存储在一个两字节的字段中。

    如果使用latin1,则每个字符都存储在1 字节中。

    所以答案是:

    VARCHAR(85) COLLATE UTF8_GENERAL_CI
    

    ,或

    VARCHAR(255) COLLATE LATIN1_GENERAL_CI
    

    【讨论】:

    • 最好使用COLLATE UTF8_UNICODE_CI,因为它更准确(除非速度是第一大问题)。
    【解决方案3】:

    我认为您将字符串大小与字符表示混淆了。

    例如,您可以有一个需要 4 个字节来表示它的字符,并将其放在最大存储大小只需要一个字节来保存长度的字符串中,因为其中的字符少于 255 个。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-07-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-02-15
      • 1970-01-01
      • 2011-12-17
      • 2011-01-01
      相关资源
      最近更新 更多