「这是我参与2022首次更文挑战的第16天,活动详情查看:2022首次更文挑战」。
在 MySQL 中,保存字符串的常用类型有 CHAR
和 VARCHAR
,本文将介绍二值的特定以及在不同的数据库引擎下的区别。
CHAR
CHAR
列的长度固定为创建表时声明的长度,即对于声明为 CHAR(n)
的列,其长度为 n
字符,其中 n
的值为 0~255。如果保存的字符串长度不到 n
,则会在字符串右侧填充空格,以达到该长度。但检索到 CHAR
类型的值时,尾部的空格会被删除。
VARCHAR
VARCHAR
列的长度是可变的,对于声明为 VARCHAR(n)
的列,其最大有效长度为 n
,其中 n
的值为 0~65535。
在 MySQL 4.1 之前的版本,n
指的是 n
字节。也就是说,如果存放的是 UTF-8 的汉字,那么 n=50
时最多只能存放 n/3=16
个汉字(每个汉字3字节)。
从MySQL 4.1版本开始,n
指的是 n
字符,也就是 n=50
时,无论存放的是数字、字母还是UTF-8汉字,都可以存放50个。
CHAR
与 VARCHAR
区别
从上面的介绍中,可以看到二值的区别如下:
- 存:
CHAR
为固定长度,VARCHAR
为可变长度 - 取:
CHAR
会去掉尾部空格,VARCHAR
(如果尾部有空格)会保留尾部空格
不同数据库存储引擎中二者的区别
- MyISAM 存储引擎:建议使用
CHAR
类型列代替VARCHAR
类型。- 静态格式是 MyISAM 表的默认存储格式。当表不包含变量长度列(如
VARCHAR
)时,使用这个格式。静态格式是最简单最安全且最快的格式。 - 如果一个 MyISAM 表包含任何可变长度列(如
VARCHAR
),则动态存储格式。动态存储格式格式复杂,对于较长的数据会出现记录碎片化的问题。
- 静态格式是 MyISAM 表的默认存储格式。当表不包含变量长度列(如
- Memory 存储引擎:使用固定长度的数据行存储,因此无论使用
CHAR
还是VARCHAR
,都是作为CHAR
类型处理。 - Innodb 存储引擎:建议使用
VARCHAR
类型。-
对于 innodb 数据表,内部使用指向数据列值的头指针,没有区分固定长度和可变长度列,因此在本质上,使用固定长度的
CHAR
列不一定比使用可变长度VARCHAR
的性能要好。 -
存储总量方面,
CHAR
平均占用的空间多于VARCHAR
,使用VARCHAR
可以减少存储总量和磁盘I/O。
-