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个字节。
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个第一个字节。