我遇到了一个website,其中说明了以下内容:
Ex:CountryCode CHAR(3)CHARSET utf8
我们要求的是一个完全包含3个字符的列。此列所需的存储空间 将是任何3个字母的名称必须适合。这意味着(3个字符)次(3个字节 每个字符)= 9个字节的存储空间。因此CHAR和utf8可能不太理想。 VARCHAR表现得更好:它只需要每个字符的字节数,如上所述。所以 文本“abc”只需要3个字节
我需要文本'abc'(使用utf8和char(3))3个字节或9个字节?! 感谢
答案 0 :(得分:2)
MySQL的内部结构将CHAR字段直接放在表结构中,例如一个简单的表格如下:
create table foo (
id int
name char(3)
);
会产生类似
的磁盘记录xxxxccccccccc
^^^^-- 4 bytes of int storage space
^^^^^^^^^ 9 bytes of utf-8 char space
由于MySQL无法事先知道您将在该字段中存储哪种文本,因此 HAS 假设最坏情况,并分配3个字符的空间。 '绝对是最长的'utf-8文本可能需要。如果没有,则过长的字符串会溢出磁盘存储并开始在相邻记录上涂写。
另一方面,varchar在表的原始数据中只有一个小的“存根”数据部分,而varchar的内容存储在其他地方。这意味着无论你使用什么类型的字符集,你的varchar(3)总是会占用相同数量的表空间存储空间。