大家好!我是鸭鸭。
鸭鸭发现,最近大家工作的积极性越来越高。每次路过同事的屏幕前,有人开着 VsCode ,有人打开 Excel。
但鸭鸭仔细一看,页面好像不太对劲?
淘宝的官网怎么变成这样了?!
鸭鸭不信邪地打开自己的淘宝,发现除了这两种,还有更多摸鱼人可选的主题:
程序员、运营、设计师……主题风格真的是适配各个不同岗位的打工人。
不知道淘宝这次更新 web 端,是不是为了方便我们上班的时候摸鱼凑单双十一。他真的,我哭死。
新主题上线之后,鸭鸭的摸鱼水平已经 next level 了!
话说回来,面试鸭之前也上线了可以摸鱼刷题的 IDEA 插件,大家上班别忘了来找鸭鸭刷题!
带大家愉快摸鱼,快乐刷题,鸭鸭可是认真的!
在 JetBrains IDE 中打开设置,找到 Plugins 插件,搜索 mianshiya
即可安装哦~
鸭鸭已经为大家准备了9000多道面试题,助力大家收获 offer,今天的摸鱼时间,来看看这道题吧!
MySQL 中 varchar 和 char 有什么区别?
回答重点
CHAR 和 VARCHAR 是两种用于存储字符串的列类型,它俩最大的不同就是一个是固定长度,一个是可变长度。
- CHAR(n):固定长度的字符串。CHAR 列的长度是固定的,即使存储的字符串长度小于定义的长度,MySQL 也会在字符串的末尾填充空格以达到指定长度(如果 char 类型的字符串后面有空格的话,innodb 会忽略)。
- VARCHAR(n):可变长度的字符串。VARCHAR 列的长度是可变的,存储的字符串长度与实际数据长度相等,并且在存储数据时会额外增加 1 到 2 个字节(字符长度超过 255,则使用两个字节)用于存储字符串的长度信息。
理论上来说 CHAR 会比 VARCHAR 快,因为 VARCHAR 长度不固定,处理需要多一次运算,但是实际上这种运算耗时微乎其微,而固定大小在很多场景下比较浪费空间,除非存储的字符确认是固定大小或者本身就很短,不然业务上推荐使用 VARCHAR。
下面以表格方式总结方便横向对比:
特点 | char | varchar |
---|---|---|
存储方式 | 定长字符串(字符串长度小于定义的长度,会使用空格进行填充) | 变长字符串(不会额外填充空格) |
存储空间 | 始终占用固定长度空间 | 只占用实际需要的存储空间 |
性能影响 | 始终占用固定长度的存储空间,因此在存储时可能会浪费一些空间 (不需要记录额外长度信息,在某些情况下可能更快) | 只占用实际需要的存储空间,因此可以节省存储空间 (需要记录额外长度信息,占据1~2个字节),在某些情况下可能稍微影响性能) |
适用场景 | 适合存储固定且短的字符串 | 适合存储变化或较长的字符串 |
扩展知识
MySQL 执行 orderby 排序的时候,会利用 sort_buffer。
假设 a、b、c 都为 varchar 类型,当前要执行select a,b,c from t1 where a = '面试鸭' order by b;
MySQL 计算 a b c 总长度比较长,sort_buffer 可能放不下,就会使用双路排序,即 sort_buffer 里存放需要排序的字段 b 和 id 进行排序,待排完后,再通过 id 回表查询得到a、b、c 字段。这样就多了回表的一步,性能比较差。
如果 select 字段长度少,那么就可以使用单路排序,即将 select 的数据都放入到 sort_buffer 中,排完序后直接返回给客户端。
这里计算 a、b、c 长度依据的就是 varchar(n) 中的 n,所以如果 n 设置很大,虽然占用空间是动态的,但是会隐性影响排序的性能。
面试鸭现在已经有 9000 多道面试题,助力大家收获 offer,欢迎来面试鸭刷题。