【问题标题】:Can InnoDB limit CHAR by byte length?InnoDB 可以按字节长度限制 CHAR 吗?
【发布时间】:2022-11-01 13:42:38
【问题描述】:

我需要存储数十亿范围内的条目,因此行房地产在这里非常宝贵。每个条目都有一个短字符串,具有以下规范:

  • 1 字节 UTF8 范围内最多 20 个字符
  • 4 字节 UTF8 范围内最多 10 个字符
  • 总字节长度 <= 50

我想在 InnoDB 中使用 utf8mb4 作为字符集执行类似 CHAR(50) 的操作,但 50 表示字节长度而不是字符长度。这可能吗?我希望数据保持清晰,但这不是必需的。

【问题讨论】:

    标签: database types innodb


    【解决方案1】:

    不。

    使用VARCHAR(20)。这允许取决于20 utf8mb4人物.我建议你使用比 20 大一点的数字,以防以后规格发生变化。您的前两个项目符号将“最多”占用 21 和 41字节, 分别。 “1”代表“长度”。

    返回CHAR。它是“固定”长度。它指的是人物.即CHAR(20) utf8mb4 始终为 80 字节。好吧,并非总是如此。 InnoDB 默默地将其更改为固定长度和可变长度之间的混合体。让我们不要陷入那种混乱。

    尽量节省空间是件好事。一定要对各种INTs 做同样的事情。

    唉,InnoDB 占用的空间是您可能预测的 2 到 3 倍。此开销对于 (1) 处理 ACID 和 (2) 速度效率是必要的。

    更多的

    “字”对齐没有用——代码太通用,无法利用这种优势。 [VAR]BINARY 计算字节数;它不进行字符集检查,因此它“更快”。 “VAR”占用一个字节,但保存在字符串本身可能比最大值短。

    对于VAR,(20)、(40)、(50) 等没有区别,但有两个例外。插入时检查最大值,超过某个点,“长度”需要 2 个字节。

    向我们展示您将存储为字符串的各种数据。我们或许可以提供更详细的建议。例如,西欧的重音字母在字符集 latin1 中占用 1 个字节,但在 utf8 中占用 2 个字节。 VARBINARY 会盲目地接受客户提供的任何东西——不理解或转换编码。

    既然你提到了“4字节”,我推断你必须使用VARCHAR(...), CHARACTER SET utf8mb4,并且max需要最大数量人物, 不是字节.切换到VARBINARY(...) 不会改变所需的空间。但是,最大值需要在字节.根据您的规格,听起来这些中的任何一个都足够并且占用相同数量的磁盘空间:

    VARCHAR(20)  -- but make that a little bigger, just in case
    VARBINARY(50)  -- ditto
    

    您是否还检查了所有数字列?很多人在不需要这么大的范围时就盲目的使用4字节的INT或者8字节的BIGINT。 FLOAT/DOUBLE 和 DECIMAL 也是如此。

    【讨论】:

    • BINARY 或 VARBINARY 会在这里工作吗?我太接近发动机的舒适极限了。我还对将行对齐到 8 字节的倍数是否对性能或存储有任何显着影响感兴趣。
    • @AranSumishii - 我添加了更多。
    猜你喜欢
    • 2013-10-08
    • 1970-01-01
    • 2012-12-23
    • 1970-01-01
    • 1970-01-01
    • 2015-10-22
    • 1970-01-01
    • 2013-12-20
    • 1970-01-01
    相关资源
    最近更新 更多