【发布时间】:2022-11-01 13:42:38
【问题描述】:
我需要存储数十亿范围内的条目,因此行房地产在这里非常宝贵。每个条目都有一个短字符串,具有以下规范:
- 1 字节 UTF8 范围内最多 20 个字符
- 4 字节 UTF8 范围内最多 10 个字符
- 总字节长度 <= 50
我想在 InnoDB 中使用 utf8mb4 作为字符集执行类似 CHAR(50) 的操作,但 50 表示字节长度而不是字符长度。这可能吗?我希望数据保持清晰,但这不是必需的。
【问题讨论】:
我需要存储数十亿范围内的条目,因此行房地产在这里非常宝贵。每个条目都有一个短字符串,具有以下规范:
我想在 InnoDB 中使用 utf8mb4 作为字符集执行类似 CHAR(50) 的操作,但 50 表示字节长度而不是字符长度。这可能吗?我希望数据保持清晰,但这不是必需的。
【问题讨论】:
不。
使用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 也是如此。
【讨论】: