MySQL VARCHAR长度和UTF-8

在MySQL中,如果我在UTF-8表中创build一个新的VARCHAR(32)字段,这是否意味着我可以在该字段中存储32个字节的数据或32个字符(多字节)?

这个答案出现在我的谷歌search结果的顶部,但是不正确,所以:

混淆可能是由于不同版本的mysql被testing。

  • 版本4计数字节
  • 版本5计数字符

http://dev.mysql.com/doc/refman/5.0/en/string-type-overview.html

MySQL以字符单位解释字符列定义中的长度规范。 (在MySQL 4.1之前,列的长度是按字节解释的。)这适用于CHAR,VARCHAR和TEXTtypes。

有趣的是(我没有想过)varchar列的最大长度受utf8的影响,如下所示:

在MySQL 5.0.3及更高版本中,VARCHAR的有效最大长度取决于最大行大小(65,535字节,在所有列之间共享)和使用的字符集。 例如,utf8字符每个字符最多可能需要三个字节,因此使用utf8字符集的VARCHAR列可以声明为最多21,844个字符。

它会让你存储32个多字节字符

要使用UTF-8节省空间,请使用VARCHAR而不是CHAR。 否则,MySQL必须在CHAR CHARACTER SET utf8列中为每个字符保留三个字节,因为这是最大可能的长度。 例如,MySQL必须为CHAR(10)CHARACTER SET utf8列预留30个字节。

http://dev.mysql.com/doc/refman/5.0/en/charset-unicode.html

varchar(32) 32个多字节数据与sortingutf8_unicode_ci ,我刚刚用XAMPP进行了testing。

 1234567890123456789012345678901234567890 

截取到:

 12345678901234567890123456789012 

请记住,这些不是正规的ASCII字符。

因为行的总数据长度是固定和快速的,所以对于高频更新表使用“char”会更好。 Varchar列使行数据大小dynamic化。 这对MyISAM并不好,但我不知道InnoDB和其他的。 例如,如果您有一个非常窄的“types”列,那么使用带有latin1字符集的char(2)来声明最小的空间会更好。

如果您使用latin1编码(例如使用PHP)连接到数据库以将PHP UTF8string保存在MySQL UTF8列中,则将使用双重UTF8编码。

如果UTF8string$s长度是32个字符,但长度是64个字节,并且列是VARCHAR(32) UTF8,则双重编码会将string$s转换为64个字符长的UTF8string,该string将在数据库中截断为32第一个字符对应于$s的32个第一个字节。