【问题标题】:Index size on VARCHAR columnVARCHAR 列的索引大小
【发布时间】:2020-10-30 21:49:02
【问题描述】:

在尝试索引 VARCHAR(256) 字段时,我收到以下错误:

MySQL 说:索引列大小太大。最大列大小为 767 字节。

它使用VARCHAR(255) 工作,但我很好奇为什么 varchar 转换为字段中每个“char”的 3 个保留字节,如果它使用可变宽度编码,它是否只是假设永远“最坏情况”字母,如果utf-8,那么三个字节?

另外,如果我只使用英文,获得大于 255 大小的最佳方法是在列上使用ascii 编码吗?

【问题讨论】:

  • 字符长度转换为字节进行计算。
  • 这在旧版本的 MySQL 中是一个限制,但在新版本中已得到纠正。您使用的是哪个 MySQL?是 5.7 还是 8.0 的选项?
  • 您是否使用任何排序规则?
  • 256 很短,请参阅dbfiddle.uk/…,但是为什么要以该大小对其进行索引,也许 FULLTEXT INDEX 会更好
  • @tadman 我目前使用的是 5.7。

标签: mysql sql unicode


【解决方案1】:

每个CHARACTER SET 都有一个最大长度,以字节为单位。对于latin1ascii,为1。每个字符占用一个字节。

对于utf8,它可能需要 3 个字节,因此因子为 3。3*255+2 = 767。“2”代表长度。

utf8mb4 涵盖所有当前定义的 Unicode 字符,每个字符最多占用 4 个字节。

我说“最多”是因为英语每个字符只占用 1 个字节;欧洲语言占用 1 或 2 个字节。中文和表情符号需要 3 或 4。

索引的实现需要为列保留尽可能多的字节空间。并且(曾经)限制为 767。较新的版本将限制提高到 3072。

同时,不要随意使用VARCHAR(256)甚至VARCHAR(255),选择一些合理的限制。

【讨论】:

    猜你喜欢
    • 2019-02-21
    • 2010-09-15
    • 1970-01-01
    • 2011-04-21
    • 1970-01-01
    • 1970-01-01
    • 2023-03-03
    • 2020-03-15
    • 1970-01-01
    相关资源
    最近更新 更多