在MySQL中,如果我在UTF-8表中创建一个新的VARCHAR(32)
字段,是否意味着我可以在该字段中存储32个字节的数据或32个字符(多字节)?
答案 0 :(得分:157)
此答案显示在我的谷歌搜索结果的顶部,但不正确所以:
混淆可能是由于正在测试的不同版本的mysql。
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列。
答案 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相似,但它实际上是导致相同效果的第二个原因。