我遇到了一个网站,该网站声明以下内容:
例如:国家代码 CHAR(3) CHARSET utf8
我们要求一列正好有 3 个字符。此列所需的存储空间必须适合任何 3 个字母的名称。这意味着(3 个字符)乘以(每个字符 3 个字节)= 9 个字节的存储空间。所以 CHAR 和 utf8 一起可能不太理想。VARCHAR 表现得更好:它只需要与上述一样多的每个字符的字节数。所以文本“abc”只需要 3 个字节
我需要文本'abc'(带有utf8和char(3))3个字节还是9个字节?!谢谢
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 无法提前知道您将在该 char 字段中存储什么样的文本,因此它必须假设最坏的情况,并分配与“绝对最长的”utf-8 文本的 3 个字符一样多的空间可能需要。如果没有,那么一个过长的字符串会溢出磁盘存储并开始在相邻记录上乱写。
另一方面,varchar 在表的原始数据中只有一个小的“存根”数据部分,而 varchar 的内容存储在其他地方。这意味着无论您使用哪种字符集,您的 varchar(3) 将始终占用相同数量的表空间存储空间。