【问题标题】:How much UTF-8 text fits in a MySQL "Text" field?MySQL“文本”字段中有多少 UTF-8 文本?
【发布时间】:2011-05-24 03:20:44
【问题描述】:

根据 MySQL,text 列包含 65,535 个字节。

如果这是一个合法的边界,那么它实际上只适合大约 32k UTF-8 字符,对吗?或者这是编写文档的人无法从字节中区分字符的“模糊”边界之一,如果设置为 utf8_general_ci 之类的东西,它实际上将允许 ~64k UTF-8 字符?

【问题讨论】:

标签: mysql utf-8


【解决方案1】:

text 列最多可以有 65,535 字节。

utf-8 字符最多可以有 3 个字节。

所以...您的实际限制可以是 21,844 个字符。

查看手册了解更多信息:http://dev.mysql.com/doc/refman/5.1/en/string-type-overview.html

可变长度字符串。 M 代表 最大列长度 人物。 M 的范围是 0 到 65,535。有效最大长度 一个 VARCHAR 是受最大 行大小(65,535 字节,即 所有列之间共享)和 使用的字符集。例如,utf8 字符最多需要三个 每个字符的字节数,所以一个 VARCHAR 使用 utf8 字符的列 set 可以声明为最大值 21,844 个字符。

【讨论】:

  • 你从哪里得到这个“最多 3 个字节”的数字? UTF-8 的代码点编码可以使用 1 到 4 个字节。
  • @Warren Young、@jcomeau_ictx、@Thanatos:虽然我完全同意你的看法。 MySQL手册没有:)
  • 哇,原来如此。 dev.mysql.com/doc/refman/5.5/en/charset-unicode-utf8.html 澄清了一点——MySQL 显然不支持 UTF-8 本身,它支持它的一个子集。 +1 给你。我现在更喜欢 PostgreSQL。
  • 这只是意味着 MySQL 目前对它们可以接受的字符范围有限制。当/如果他们解除限制并支持全部范围,基于当前每个字符 3 字节值的假设将被打破。你可以永远依赖 4 字节的限制:Unicode 联盟已经为你确定了而不是确定。
  • 大多数使用永远不会使用超过 2 字节标记的字符,这就是为什么我坚持使用 32k 而不是从混合 UTF-8 中命名所有可能的大小。
【解决方案2】:

UTF-8 字符每个最多可以占用 4 个字节,而不是您假设的 2 个字节。 UTF-8 is a variable-width encoding,取决于 Unicode 代码点中的有效位数:

  • 在 Unicode 码位中为 7 位及以下:在 UTF-8 中为 1 字节
  • 8 到 11 位:UTF-8 中的 2 个字节
  • 12 到 16 位:3 个字节
  • 17 到 21 位:4 个字节

original UTF-8 spec 允许编码最多 31 位 Unicode 值,以 UTF-8 格式编码最多需要 6 个字节。 UTF-8 流行之后,Unicode 联盟宣布他们永远不会使用超过 221 - 1 的码位。现在标准化为 RFC 3629

MySQL currently (即版本 5.6)仅支持 Unicode Basic Multilingual Plane 字符,UTF-8 每个字符最多需要 3 个字节。这意味着您的问题的当前答案是您的 TEXT 字段至少可以包含 21,844 个字符。

根据你的看法,实际限制高于或低于:

  • 如果您像我一样假设 BMP 限制最终将在 MySQL 或 its forks 之一中解除,那么您不应该指望能够在该字段中存储超过 16,383 个字符,如果您MySQL 客户端允许任意 Unicode 文本输入。

  • 另一方面,您可以利用 UTF-8 是可变宽度编码这一事实。如果您知道您的文本大部分是纯英语,偶尔会出现非 ASCII 字符,那么您的有效实践限制可能会接近最大 64 KB - 1 个字符的限制。

【讨论】:

  • "只能假设该字段最多可以容纳 16K 字符的 UTF-8 文本。" ← 我要澄清一下...
【解决方案3】:

但是,当用作主键时,MySQL 假定每个列的大小限制都会向键添加 3 个字节

mysql> alter table test2 modify code varchar(333) character set utf8;
Query OK, 0 rows affected (0.05 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> alter table test2 modify code varchar(334) character set utf8;
ERROR 1071 (42000): Specified key was too long; max key length is 1000 bytes

嗯,使用长字符串列作为主键通常是一种习惯做法,但是我在使用一个商业 (!) 产品的数据库时遇到了这个问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-22
    • 2021-05-15
    • 1970-01-01
    • 2011-08-18
    相关资源
    最近更新 更多