char 和 varchar 都是 MySql 数据库中存储字符串的数据类型,它们也是经常被面试的题目之一。他们之间到底有啥区别?使用的时候该如何选择呢?
下面我们就 varchar 和 char进行详细说明。
char类型
char类型用于存储长度固定的字符串。存储范围:0~255个字符。举个例子:char(10) ,设置了10个字符,最多存储10个字符;字符串 "abc" 实际存储长度为10,包括7个空字符。但是,如果尾部有空字符,不被保留。因此,char的存储空间计算公式为:
char的存储空间 = 存储的预定空间 + 一个记录字符串长度的字节。
-
特点:有可能浪费存储空间,但存储效率高;
-
存储策略:用空间换时间;浪费点空间,提高存储效率;
-
适用范围:md5加密字段、uid等长度固定的字段,或者存储的值都接近一个长度的字符串,以便提高存储效率。
varchar类型
varchar类型用于存储可变长度字符串。存储范围:0~65532个字符。举个例子:varchar(10),设置了10个字符,最多存储10个字符;字符串 "abc" 实际存储长度为3。如果尾部有空字符,会被保留。varchar对字符串的存储是这样的,字符串长度为255以内时,会保留一个字节存储字符串长度;字符串长度大于255时,会保留2个字节存储字符串长度;每次更改时,都需要更改存储长度,所以存储效率低;但是,varchar存储空间小。
- 特点:节约存储空间,但存储效率低;
- 存储策略:用时间换空间,可以节约存储空间;
- 适用范围:备注等长度变化很大的字段,以便节约存储空间。
char 和 varchar 对比结果
我们从存储长度、存储效率、存储空间三个方面对比了char和varchar。得出这样一个结论:
- char可能存在多余空间,但存储效率高;而varchar则比较节约存储空间,但存储效率低;
- char使用空间换时间,而varchar则牺牲时间换空间。
总的来说,char和varchar各有各的优缺点,因此在做数据库设计时,类似于md5加密、uid等固定长度的字符串,可以使用char来存储,以便获取更高的存储效率和查询性能。
最后总结
前面说了那么多,我们来做个测试验证一下,看一看它们的长度。
先说明一下:
单位是字节,uft8编码下一个汉字占用三个字节,gdk编码下一个汉字占用两个字节,字母、数字各占一个字节;
有一个表test,表里有两个字段,name的数据类型是char(10),remark的数据类型是varchar(10),执行以下命令,查看一下它们各自的长度。
select name, char_length(name),length(name) , remark, char_length(remark),length(remark) from test;
执行结果如下图所示:
查询结果好像和我们想的不一样,char类型为何不是固定长度10呢?我们再来增加一条尾部带空字符串的数据看一下效果。
insert into test_aa values('123456789 ','我们 ');
再查询一次,查询结果如下图所示:
char类型的字段,尾部空字符串没被保留;而varchar类型的字段,尾部空格保留了。其实,在上面我们已经说得很清楚了。char长度不足时会补足空字符,但末尾有空字符串时又不被保留,所以我们看到的查询结果是没有算上末尾空字符串的长度的。这就可以解释为什么我们查询的char结果不是固定长度。
评论区