一个MySQL能容纳多少UTF-8文本;“文本”;领域

一个MySQL能容纳多少UTF-8文本;“文本”;领域,mysql,utf-8,Mysql,Utf 8,根据MySQL,一个text列包含65535个字节 因此,如果这是一个合法的边界,那么它实际上只能容纳32k UTF-8字符,对吗?或者这是一个“模糊”的边界,写文档的人无法区分字符和字节,如果设置为类似于utf8\u general\u ci?Atext列最多可以65535字节,它实际上允许64k个UTF-8字符 utf-8字符最多可包含3个字节 所以。。。您的实际限制可以是21844个字符 有关更多信息,请参阅手册: 长度可变的字符串。M代表 中的最大列长度 人物。M的范围是0到0 65,5

根据MySQL,一个
text
列包含65535个字节


因此,如果这是一个合法的边界,那么它实际上只能容纳32k UTF-8字符,对吗?或者这是一个“模糊”的边界,写文档的人无法区分字符和字节,如果设置为类似于
utf8\u general\u ci

A
text
列最多可以
65535
字节,它实际上允许64k个UTF-8字符

utf-8
字符最多可包含3个字节

所以。。。您的实际限制可以是
21844
个字符

有关更多信息,请参阅手册:

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


UTF-8字符每个最多可以占用4个字节,而不是您假设的2个字节,根据Unicode代码点中有效位的数量:

  • Unicode码点中的7位及以下:UTF-8中的1字节
  • 8到11位:UTF-8中的2字节
  • 12至16位:3字节
  • 17至21位:4字节
允许最多编码31位Unicode值,以UTF-8格式编码最多需要6个字节。在UTF-8流行之后,Unicode联盟宣布他们将永远不会使用超过221的代码点 - 1.这现在被标准化为

MySQL(即5.6版)只支持Unicode字符,UTF-8每个字符最多需要3个字节。这意味着当前对您的问题的回答是,
文本
字段至少可以容纳21844个字符

根据您的看法,实际限值高于或低于:

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

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


然而,当用作主键时,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

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

从哪里可以得到这个“最多3个字节”的数字?UTF-8对代码点的编码可以使用1到4个字节。@Warren Young,@jcomeau_ictx,@Thanatos:尽管我完全同意你的看法。MySQL手册没有:)哇,的确如此。稍微澄清一下——MySQL本身显然不支持UTF-8,它支持UTF-8的一个子集+祝你好运。我现在更喜欢PostgreSQL了。这只是意味着MySQL目前对可以接受的字符范围有限制。当/如果他们解除限制并支持全范围时,基于当前每字符3字节值的假设将被打破。你可以永远依赖4字节限制:Unicode联盟已经为你敲定了。大多数使用将永远不会使用超过2字节的字符,这就是为什么我坚持使用32k,而不是从混合UTF-8命名所有可能的大小。“只能假设该字段最多可以容纳16K个UTF-8文本字符。”← 我想澄清一下……简单的回答是:这么多-->(21844个3字节UTF-8字符)