Skip to content

面试速答(先看这里)

**一句话结论:**char和varchar都是用于在数据库中存储字符串的数据类型。

60秒标准回答:

char和varchar都是用于在数据库中存储字符串的数据类型。它们之间的主要区别在于存储空间的使用方式

char是一种定长的数据类型,它的长度固定且在存储时会自动在结尾添加空格来将字符串填满指定的长度 。char的长度范围是0-255

varchar是一种可变长度的数据类型,它只会存储实际的字符串内容,不会填充空格 。因此,在存储短字符串时,varchar可以节省空间。varchar的长度范围是0-65535(MySQL 5.0.3之后的版本)

**答题顺序:**结论 → 原理/机制 → 关键流程 → 场景与取舍 → 易错点

回答主线:

  • **要点1:**varchar是一种可变长度的数据类型,它只会存储实际的字符串内容,不会填充空格 。
  • **要点2:**如果使用char(100),则插入记录后就分配了100个字符,后续修改不会造成页分裂的问题,而varchar(100)由于没有提前分配存储空间,因为表中数据刚开始插入时,可变长度字段值都是根据实际长度存储下来的,且行与行之间数据也是紧密连续存放在文件地址中的。
  • **要点3:**varchar的优点是 变长的字符串类型,兼容性更好;
  • **要点4:**例如 ,存储产品描述(可变长度)、存储用户地址(可变长度)、存储用户名称(可变长度),这些都适合用varchar。
  • **要点5:**char的优点是 定长的字符串类型,减少内存碎片,并且无需额外的磁盘空间去存储长度信息。

**记忆锚点:**varchar → char → hollis → MySQL → 例如 → 存储字符串的数据类

关键取舍:

  • 它们之间的主要区别在于存储空间的使用方式: char是一种定长的数据类型,它的长度固定且在存储时会自动在结尾添加空格来将字符串填满指定的长度 。
  • varchar的优点是 变长的字符串类型,兼容性更好;
  • char的优点是 定长的字符串类型,减少内存碎片,并且无需额外的磁盘空间去存储长度信息。

易错提醒:

  • 但是他的缺点是会丢失列末尾的空格信息 char会在长度不足时,在后面补充空格,所以当我要在一个长度为10的char中,分别存一个 "hollis " 和 "hollis" 时,他存储的都是 "hollis " ,所以会丢失原来存储的空格信息。

加分表达:

  • 如果使用char(100),则插入记录后就分配了100个字符,后续修改不会造成页分裂的问题,而varchar(100)由于没有提前分配存储空间,因为表中数据刚开始插入时,可变长度字段值都是根据实际长度存储下来的,且行与行之间数据也是紧密连续存放在文件地址中的。

追问准备:

  • 围绕「varchar」:底层原理是什么?使用时有哪些边界和常见坑?
  • 围绕「char」:底层原理是什么?使用时有哪些边界和常见坑?
  • 围绕「hollis」:底层原理是什么?使用时有哪些边界和常见坑?
  • 如果线上出现异常,你会如何定位、验证并规避?

典型回答 ​

char和varchar都是用于在数据库中存储字符串的数据类型。它们之间的主要区别在于存储空间的使用方式:

char是一种定长的数据类型,它的长度固定且在存储时会自动在结尾添加空格来将字符串填满指定的长度。char的长度范围是0-255,

varchar是一种可变长度的数据类型,它只会存储实际的字符串内容,不会填充空格。因此,在存储短字符串时,varchar可以节省空间。varchar的长度范围是0-65535(MySQL 5.0.3之后的版本)。

如果使用char(100),则插入记录后就分配了100个字符,后续修改不会造成页分裂的问题,而varchar(100)由于没有提前分配存储空间,因为表中数据刚开始插入时,可变长度字段值都是根据实际长度存储下来的,且行与行之间数据也是紧密连续存放在文件地址中的。那么现在值变长了,原来的位置无法扩展出新的空间出来,所以无法覆盖存放到原来的位置上。此时MySQL就会使用页分裂的方法扩展字段变长的空间。

📄 ✅什么是InnoDB的页分裂和页合并

打开文档:✅什么是InnoDB的页分裂和页合并

varchar的优点是变长的字符串类型,兼容性更好;但是同时也会带来一些问题,如使用varchar可能会产生内存碎片、varchar会额外需要1到2个字节存储长度信息、以及update语句可能会导致页分裂等。

例如,存储产品描述(可变长度)、存储用户地址(可变长度)、存储用户名称(可变长度),这些都适合用varchar。

char的优点是定长的字符串类型,减少内存碎片,并且无需额外的磁盘空间去存储长度信息。但是他的缺点是会丢失列末尾的空格信息

📄 ✅MySQL为什么会有存储碎片?有什么危害?

打开文档:✅MySQL为什么会有存储碎片?有什么危害?

> char会在长度不足时,在后面补充空格,所以当我要在一个长度为10的char中,分别存一个"hollis "和"hollis"时,他存储的都是"hollis ",所以会丢失原来存储的空格信息。

例如,存储身份证号(固定长度)、存储订单号(固定长度)、存储国家编码(固定长度),这些都适合用char。