根据MySQL,text
列包含65,535个字节。
因此,如果这是一个合法的边界,那么它实际上只适合大约32k UTF-8字符,对吗?或者这是那些“模糊”边界,其中编写文档的人不能从字节中分辨字符,如果设置为utf8_general_ci
,它实际上允许〜64k UTF-8字符?
答案 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代码点中的有效位数:
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个字符。
根据您的观察方式,实际限制高于或低于:
答案 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
好吧,使用长字符串列作为主键通常是一种惯例,但是当我使用一个商业(!)产品的数据库时,我遇到了这个问题。