标签搜索

目 录CONTENT

文章目录

「死磕面试」varchar和char,数据库设计时应该如何选择?

沙漠渔
2023-02-23 02:59:32 / 0 评论 / 0 点赞 / 374 阅读 / 1,808 字 / 正在检测是否收录...
温馨提示:
本文最后更新于 2023-02-23,若内容或图片失效,请留言反馈。部分素材来自网络,若不小心影响到您的利益,请联系我们删除。

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;

执行结果如下图所示:

3816895c8280e07ff39dda2.webp

查询结果好像和我们想的不一样,char类型为何不是固定长度10呢?我们再来增加一条尾部带空字符串的数据看一下效果。

insert into test_aa values('123456789 ','我们 ');

再查询一次,查询结果如下图所示:

381689528dbda24211236da.webp

char类型的字段,尾部空字符串没被保留;而varchar类型的字段,尾部空格保留了。其实,在上面我们已经说得很清楚了。char长度不足时会补足空字符,但末尾有空字符串时又不被保留,所以我们看到的查询结果是没有算上末尾空字符串的长度的。这就可以解释为什么我们查询的char结果不是固定长度。

0
广告 广告

评论区