大家好呀,我是小米,一个31岁还在坚持折腾技术的“老菜鸟”。说实话,我面过不少社招,踩过的坑比写过的 bug 还多。今天想和大家聊聊我一次“翻车又逆袭”的面试经历。故事的主角不是我,而是一道看似简单却能卡住无数人的面试题:

“mysql 中 int(10)、char(10)、varchar(10) 的区别是什么?”

是不是一看就觉得:“小儿科嘛,这不就是数据类型的区别么?”但是,面试官往往喜欢在简单的问题里下刀子。那天我差点被问懵,好在后来扳回了一局。今天就用故事的形式,带你把这道题掰开、揉碎、吃透!

面试现场:看似简单的“送命题”

那天我去面试一家互联网公司,职位是 Java 后端工程师。面试官是个戴眼镜的中年大哥,看起来温文尔雅,但一开口就让我心里一紧。

他轻描淡写地问:“小米,你能说说 mysql 里 int(10)、char(10)、varchar(10) 有什么区别吗?”

我心想,这不是基础吗?int、char、varchar,不就是整数、定长字符串、变长字符串吗?于是我三句话带过:

  • int(10):整数类型,10 表示长度。
  • char(10):定长字符串,不足补空格。
  • varchar(10):变长字符串,按实际存储。

说完我还挺得意,想着这题拿下了。

没想到面试官推了推眼镜,笑着说:“嗯,挺好。那你再具体说说,int(10) 里的 10 到底有什么用?char(10) 和 varchar(10) 的性能差别在哪?如果存储中文会有什么影响?再比如,MySQL 5.7 和 8.0 在 int(10) 上的区别是什么?”

我当场愣住,脑子里“嗡”的一下,原来这是个陷阱题啊!

被问懵之后,我开始复盘

回到家,我觉得这题必须整明白。于是我泡了一杯咖啡,打开 MySQL,查了官方文档,还顺手写了几个实验 SQL。最终我总结出一条真理:

这道题表面是考数据库类型,实际上考你对 MySQL 存储机制、历史兼容性和性能优化的理解。

接下来,我就带大家一起复盘。咱们从 int(10) 开始拆解。

int(10) 的真相:那个 “10” 没你想的那么简单

很多人以为 int(10) 表示这个整数最多能存 10 位数,其实完全不是这么回事!

来,我们先看事实:

  • int 的取值范围和显示宽度无关,只和类型本身有关。
  • int 的范围是 -2147483648 ~ 2147483647,和 int(10) 没半毛钱关系。
  • 那 int(10) 中的 10 到底干嘛的?

其实,这里的 10 是 显示宽度(Display Width)

在早期 MySQL(比如 5.6、5.7)里,如果你写了 int(10) zerofill,那么当你插入一个数字 123,显示时会自动补零变成:

面试必考!mysql中 int(10)、char(10)、varchar(10) 的真相,99%的人都答错过_字符串

是不是瞬间懂了?int(10) 里的 10,其实就是用来“凑显示宽度”的,只有在配合 zerofill 时才有用。

注意:到了 MySQL 8.0,这个特性已经被废弃了!官方直接移除了显示宽度。也就是说,在新版本里,int(10) 和 int 没任何区别。

面试小技巧:如果面试官问这个点,你可以顺手补一句:“在 MySQL 8.0 之后,int(M) 的写法已经不推荐了,只剩下 int。” 这样就能加分。

char(10):老实又固执的“定长工人”

接下来说说 char(10)

这个类型的特点是 定长,无论你存入几个字符,它都会占用 固定的 10 个字节

举个例子:

面试必考!mysql中 int(10)、char(10)、varchar(10) 的真相,99%的人都答错过_MySQL_02

存进去的其实是 'abc '(后面补了 7 个空格)。

优点:

  • 查询速度快,特别适合存储长度固定的数据,比如身份证号、手机号、MD5 值。
  • 因为是定长,所以在磁盘上存取更整齐,索引效率也更高。

缺点:

  • 浪费空间。比如你只存了 3 个字符,它也要占 10 个字符的空间。
  • 如果存中文,麻烦更大。UTF-8 一个汉字 3 个字节,那 char(10) 最多能存 3 个汉字 + 1 个英文。GBK 编码下,一个汉字 2 个字节,那就能存 5 个汉字。是不是坑挺多?

面试补刀:你可以顺带说一句,“char 适合存储固定长度的字段,比如身份证号、银行卡号,而不适合变长数据。”

varchar(10):灵活机动的“节约大师”

再说说 varchar(10)

和 char 不同,它是 变长字符串

比如你存 'abc',只会占用 3 个字节(外加 1 个字节记录长度信息),非常节省空间。

优点:

  • 节省存储空间。
  • 更灵活,适合存储长度不固定的数据。

缺点:

  • 因为是变长,每次查询时都需要动态计算长度,性能比 char 稍差。
  • 容易触发行迁移。比如原来存了 3 个字节,后来更新成 10 个字节,如果这一行放不下,就会被挪到别的地方,导致额外的开销。

中文影响:

同样要注意字符集问题。varchar(10) 里的 10 表示的是“字符数”,而不是字节数。如果是 utf8,一个汉字算一个字符,所以 varchar(10) 可以存 10 个汉字。

面试补刀:你可以强调“varchar 更适合绝大多数字段,但索引效率略低于 char”。

三者对比:一个故事帮你记牢

我给大家打个比方,把 int、char、varchar 想象成三个“性格不同的舍友”:

  • int(10): 一个看上去爱炫耀的舍友,总说“我有 10 位数宽度”,其实只是装门面。真正实力(存储范围)跟 10 一点关系没有。
  • char(10): 一个死板的舍友,做事一板一眼。无论事情大小,都要花固定 10 分钟去干。好处是整齐划一,坏处是浪费时间。
  • varchar(10): 一个灵活的舍友,做什么事只花必要的时间。但有时候为了临时搬家,会折腾半天。

这样一想,是不是很容易记住?

面试必考!mysql中 int(10)、char(10)、varchar(10) 的真相,99%的人都答错过_MySQL_03

面试实战:如何回答才能加分?

如果你在面试中遇到这个问题,可以分三个层次来答:

1、基础回答(保底分):

  • int(10) 里的 10 在 MySQL 8.0 之后没意义,以前是显示宽度。
  • char(10) 是定长,存储和索引快,但浪费空间。
  • varchar(10) 是变长,节省空间,但查询略慢。

2、进阶回答(加分):

  • char 更适合存储固定长度的字段,比如身份证号。
  • varchar 适合大多数文本字段,但要注意更新时可能引发存储开销。
  • int(10) 和 int 的取值范围无关,只和 int 类型本身有关。

3、高级回答(面试官眼前一亮):

  • 在 MySQL 5.7 之前,int(10) + zerofill 会补零显示。
  • 在 MySQL 8.0 已经移除了显示宽度,直接用 int。
  • char 和 varchar 的存储与字符集有关,比如 utf8 下 varchar(10) 能存 10 个汉字,而 char(10) 最多只能存 3 个汉字。

面试官听到你能聊到这个深度,基本会觉得你不仅会写 CRUD,还懂数据库底层机制。

我的逆袭时刻

后来我又面试了一家公司,果然又被问到类似的问题。

这一次,我胸有成竹,从 int(10) 的历史说到 MySQL 8.0 的变化,又聊到 char 和 varchar 的优缺点,还举例说明不同场景下怎么选。

面试官听完后点点头:“不错,你对数据库挺熟的。”

那一刻,我心里暗爽:上次的坑,这次终于填上了!

总结:面试题背后的本质

最后,我们来梳理一下:

1、int(10)

  • 取值范围和 10 无关。
  • 10 是显示宽度,只在 zerofill 下有用。
  • MySQL 8.0 之后废弃了显示宽度。

2、char(10)

  • 定长,固定占 10 个字节。
  • 适合存储固定长度数据。
  • 查询速度快,但浪费空间。

3、varchar(10)

  • 变长,按实际字符数存储。
  • 节省空间,灵活。
  • 查询时性能略差,更新可能引发行迁移。

面试回答一定要分层次:先说基本区别,再加上历史版本差异,最后结合实际场景举例。这样才会显得你真正理解了。

送你一句话

写到这里,我想送大家一句话:

“面试题从来不是考你死记硬背,而是考你能不能理解背后的设计思想。”

MySQL 为什么会设计 int(10) 这样的显示宽度?为什么 char 和 varchar 各有利弊?这背后其实都在提醒我们:选型比写代码更重要。

END

希望你下次遇到这道题,不仅能答对,还能答精彩!

我是小米,一个喜欢分享技术的31岁程序员。如果你喜欢我的文章,欢迎关注我的微信公众号“软件求生”,获取更多技术干货!