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

Xeo*_*oss 47 mysql utf-8

据MySQL称,一text列有65,535个字节.

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

Wol*_*lph 74

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字符每个字符最多可能需要三个字节,因此使用utf8字符集的VARCHAR列可以声明为最多21,844个字符.

  • @Warren Young,@ jcomeau_ictx,@ Thanatos:虽然我完全同意你的看法.MySQL手册没有:) (14认同)
  • 哇,所以确实如此.http://dev.mysql.com/doc/refman/5.5/en/charset-unicode-utf8.html有点澄清 - MySQL显然不支持UTF-8本身,它支持它的一个子集.+1给你.我现在更喜欢PostgreSQL了. (7认同)
  • 一旦将所有的星系外字符集添加到Unicode中,utf-8字符最多可以为4个字节,最终可以为5个或更多:^) (3认同)

War*_*ung 11

UTF-8字符每个最多可占用4个字节,而不是您想要的2个字节.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开始流行之后,Unicode联盟声明他们永远不会使用超过2 21  - 1的代码点.现在标准化为RFC 3629.

MySQL 当前(即5.6版)仅支持Unicode 基本多语言平面字符,UTF-8每个字符最多需要3个字节.这意味着您的问题的当前答案是您的TEXT字段可以容纳至少21,844个字符.

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

  • 如果你认为,像我一样,将BMP限制,最终将在MySQL或提升的一个 ,你不应该能够超过16,383个字符存储在该领域的计算,如果你的MySQL客户端允许任意的Unicode文本输入.

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