多lessUTF-8文本适合MySQL“文本”字段?

根据MySQL,一个text列保存了65535字节。

所以如果这是一个合理的边界,那么它实际上只适合大约32k的UTF-8字符,对吧? 或者是这种“模糊”边界之一,写文档的人不能从字节中指出字符,如果设置为utf8_general_ci ,它实际上会允许〜64k UTF-8字符?

一个text列可以达到65,535字节。

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

所以…你的实际限制可以是21,844字符。

有关更多信息,请参阅手册: http : //dev.mysql.com/doc/refman/5.1/zh-CN/string-type-overview.html

一个可变长度的string。 M代表字符中的最大列长度。 M的范围是0到65,535。 VARCHAR的有效最大长度取决于最大行大小(65,535字节,在所有列中共享)和使用的字符集。 例如,utf8字符每个字符最多可能需要三个字节,因此使用utf8字符集的VARCHAR列可以声明为最多21,844个字符。

UTF-8字符最多可以占用4个字节,而不是像您所想的那样。 UTF-8是一种可变宽度编码 ,取决于Unicode代码点中有效位的数量:

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

原始的UTF-8规范允许编码多达31位的Unicode值,最多可以用6个字节编码为UTF-8格式。 在UTF-8成为stream行之后,Unicode联盟宣布他们将永远不会使用超过2 21 – 1的代码点。现在这个标准已经被标准化为RFC 3629 。

当前的 MySQL(即版本5.6)只支持Unicode Basic Multilingual Plane字符,UTF-8每个字符最多需要3个字节。 这意味着你的问题目前的答案是你的TEXT字段可以容纳至less21,844个字符。

取决于你如何看待它,实际的限制是高于或低于:

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

  • 另一方面,你也许可以利用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 

那么,使用长string列作为主键通常是一个床的做法,但是我在处理一个商业(!)产品的数据库时遇到了这个问题。