Yihui’s Blog

MySQL 中 VARCHAR(100) 和 VARCHAR(10) 的区别是什么?

日期:2026-07-11
难度:简单
标签:#面试 #MySQL #VARCHAR #数据类型 #VIP

一句话答案

两者按实际内容变长存储,但最大字符数分别是 100 和 10;声明长度还会影响长度前缀、行大小、索引长度、临时计算内存和数据约束,不能因为实际值短就认为完全相同。

面试口语版

VARCHAR 的 M 表示最大字符数,不是固定字节数。存同一个短字符串时,两者的数据主体占用接近,都是实际字节加 1 或 2 字节长度前缀;但最大可能字节数由字符集决定,例如 utf8mb4 最多每字符 4 字节。VARCHAR(100) 更容易使用 2 字节长度前缀,也会占用更多最大行长和索引预算,某些排序、临时表或客户端元数据会按声明最大长度估算资源。建表时应按业务真实上限定义,既提供约束,也避免不必要的资源和索引成本。

原理拆解

项目VARCHAR(10)VARCHAR(100)
最大字符数10100
实际数据存储实际字节 + 长度前缀实际字节 + 长度前缀
utf8mb4 最大数据字节40400
约束能力更严格更宽松
索引/行大小预算更小更大

关键细节

  • 长度前缀按最大可能字节数判断:不超过 255 字节通常为 1 字节,否则为 2 字节。
  • VARCHAR(10) 可存 10 个字符,实际字节数随字符集和内容变化。
  • 盲目统一成 VARCHAR(255) 会弱化数据约束,并可能放大临时计算与索引成本。

面试官追问

  1. utf8mb4 下 VARCHAR(100) 最多占多少数据字节?
  2. VARCHAR 的长度前缀为什么有 1 或 2 字节?
  3. 声明长度会影响查询性能吗?

高分补充

字段长度不仅是存储配置,也是领域约束,应与 API 校验、索引和下游协议保持一致。

学习清单

  • 区分字符数、字节数、实际长度和声明上限。
维护与整理 · Yihui在 GitHub 上编辑

继续阅读

浏览全部文章

SQL与NoSQL有什么区别?MySQL和MongoDB如何选型?实际项目中如何选择?

日期:2026-09-27 标签:#面试 #MySQL #数据库 难度:简单 来源:牛面 MySQL 题库 答案说明:独立整理(站内题目标记为 VIP,未读取会员答案) 一句话答案 MySQL与MongoDB的主要差异在数据模型、事务边界、查询方式和模式演化;按业务访问模式和一致性需求选型。 面试口语版(约 60…

阅读全文