MySQL VARCHAR长度和UTF-8

时间:2010-01-04 04:41:38

标签: mysql unicode utf-8 varchar

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

5 个答案:

答案 0 :(得分:157)

此答案显示在我的谷歌搜索结果的顶部,但不正确所以:

混淆可能是由于正在测试的不同版本的mysql。

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

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

  

MySQL以字符为单位解释字符列定义中的长度规范。 (在MySQL 4.1之前,列长度以字节为单位进行解释。)这适用于CHAR,VARCHAR和TEXT类型。

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

  

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

答案 1 :(得分:8)

它可以存储32个多字节字符

  

要使用UTF-8节省空间,请使用   VARCHAR而不是CHAR。除此以外,   MySQL必须保留三个字节   CHAR CHARACTER SET中的每个字符   因为那是utf8专栏   最大可能长度。例如,   MySQL必须为a保留30个字节    CHAR(10)字符集utf8列。

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

答案 2 :(得分:5)

32 {strong> 多字节 varchar(32)的数据,排序utf8_unicode_ci,我刚刚使用XAMPP进行了测试。

1234567890123456789012345678901234567890

被截断为:

12345678901234567890123456789012

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

答案 3 :(得分:1)

最好将“char”用于高频率更新表,因为行的总数据长度将是固定且快速的。 Varchar列使行数据大小动态化。这对MyISAM来说并不好,但我不知道InnoDB和其他人。例如,如果你有一个非常狭窄的“类型”列,那么使用带有latin1字符集的char(2)可能更好,只能声称空间最小。

答案 4 :(得分:0)

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

如果UTF8字符串$s长度为32个字符但长度为64个字节且列为VARCHAR(32) UTF8,则双重编码会将字符串$s转换为64个字符长的UTF8字符串这将在数​​据库中被截断为其对应于$s的32个第一个字节的32个第一个字符。您可能最终认为MySQL 5的行为与MySQL 4相似,但它实际上是导致相同效果的第二个原因。