1

我遇到了一个网站,该网站声明以下内容:

例如:国家代码 CHAR(3) CHARSET utf8

我们要求一列正好有 3 个字符。此列所需的存储空间必须适合任何 3 个字母的名称。这意味着(3 个字符)乘以(每个字符 3 个字节)= 9 个字节的存储空间。所以 CHAR 和 utf8 一起可能不太理想。VARCHAR 表现得更好:它只需要与上述一样多的每个字符的字节数。所以文本“abc”只需要 3 个字节

我需要文本'abc'(带有utf8和char(3))3个字节还是9个字节?!谢谢

4

1 回答 1

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 无法提前知道您将在该 char 字段中存储什么样的文本,因此它必须假设最坏的情况,并分配与“绝对最长的”utf-8 文本的 3 个字符一样多的空间可能需要。如果没有,那么一个过长的字符串会溢出磁盘存储并开始在相邻记录上乱写。

另一方面,varchar 在表的原始数据中只有一个小的“存根”数据部分,而 varchar 的内容存储在其他地方。这意味着无论您使用哪种字符集,您的 varchar(3) 将始终占用相同数量的表空间存储空间。

于 2013-06-22T21:47:43.380 回答