一个MySQL能容纳多少UTF-8文本;“文本”;领域
根据MySQL,一个一个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
text
列包含65535个字节
因此,如果这是一个合法的边界,那么它实际上只能容纳32k UTF-8字符,对吗?或者这是一个“模糊”的边界,写文档的人无法区分字符和字节,如果设置为类似于
utf8\u general\u ci
?Atext
列最多可以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字节
文本
字段至少可以容纳21844个字符
根据您的看法,实际限值高于或低于:
- 如果您像我一样假设BMP限制最终将在MySQL或其中一个中解除,那么如果您的MySQL客户端允许任意Unicode文本输入,您不应该指望在该字段中存储超过16383个字符
- 另一方面,您可以利用UTF-8是可变宽度编码这一事实。如果您知道您的文本大部分是纯英语,偶尔只包含非ASCII字符,那么您的实际有效限制可能接近最大64位 KB - 1个字符限制
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字符)