MySQL“文本”字段中有多少UTF-8文本?

时间:2010-12-12 02:40:53

标签: mysql utf-8

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

因此,如果这是一个合法的边界,那么它实际上只适合大约32k UTF-8字符,对吗?或者这是那些“模糊”边界,其中编写文档的人不能从字节中分辨字符,如果设置为utf8_general_ci,它实际上允许〜64k UTF-8字符?

3 个答案:

答案 0 :(得分:72)

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个字符。

答案 1 :(得分:11)

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值,最多6个字节以UTF-8格式编码。在UTF-8开始流行之后,Unicode联盟声明他们永远不会使用超过2 21 的代码点.1。现在标准化为RFC 3629

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

根据您的观察方式,实际限制高于或低于:

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

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

答案 2 :(得分: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

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