在MySQL中,如果我VARCHAR(32)
在UTF-8表中创建一个新字段,是否意味着我可以在该字段中存储32个字节的数据或32个字符(多字节)?
在MySQL中,如果我VARCHAR(32)
在UTF-8表中创建一个新字段,是否意味着我可以在该字段中存储32个字节的数据或32个字符(多字节)?
Answers:
这个答案出现在我的Google搜索结果的顶部,但不正确,所以:
混乱可能是由于测试了不同版本的mysql。
http://dev.mysql.com/doc/refman/5.0/zh-CN/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个字符。
utf8mb4
)可以存储“💩💩💩💩💩💩💩💩💩💩”(10堆便便),即10个字符,但40个字节。
它会让您存储32个多字节字符
要使用UTF-8节省空间,请使用VARCHAR而不是CHAR。否则,MySQL必须为CHAR CHARACTER SET utf8列中的每个字符保留三个字节,因为这是最大可能的长度。例如,MySQL必须为CHAR(10)CHARACTER SET utf8列保留30个字节。
CHAR
并且在执行时不打算存储多字节字符,所以我很安全。那么VARCHAR
,您确定限制是在多字节字符中定义的,而不是在单字节字符中定义的吗?
我使用XAMPP测试了32个多字节的varchar(32)
排序规则数据utf8_unicode_ci
。
1234567890123456789012345678901234567890
被截断为:
12345678901234567890123456789012
请记住,这些不是常规的ASCII字符。
utf8
,则会在MySQL中得到残破的Unicode支持。您应该改用utf8mb4
编码,因为有最大值。utf-8字符中的4个字节,而不是MySQL的utf8变体中的3个字节...
最好将“ char”用于频繁更新表,因为该行的总数据长度将是固定且快速的。Varchar列使行数据大小动态变化。这对MyISAM不利,但我不了解InnoDB和其他数据库。例如,如果您的“类型”列非常狭窄,则最好将char(2)与latin1字符集一起使用以仅占用最小空间。
CHAR
。对于InnoDB,还有许多其他事情正在进行,因此“动态/固定行大小”的争论本质上是无关紧要的。
CHAR
。
如果使用latin1编码(例如,使用PHP)连接到数据库以将PHP UTF8字符串保存在MySQL UTF8列中,则将使用双UTF8编码。
如果UTF8字符串的$s
长度为32个字符但长度为64个字节,并且该VARCHAR(32)
列为UTF8,则双重编码会将字符串转换$s
为64个字符的长度UTF8字符串,该字符串将在数据库中被截断为对应于32个第一个字节的前32个字符。的$s
。您可能最终认为MySQL 5的行为类似于MySQL 4,但实际上,这是产生相同效果的第二个原因。