在 mysql 表设计中,字符串字段常用 varchar 和 text 类型,但它们在 存储方式、性能、使用限制 等方面存在明显区别。
一、varchar 和 text 基本介绍
1. varchar
- 可变长度字符串,最大长度由定义决定。
- 最大长度:0 ~ 65535 字节(受行大小限制)。
- 存储时需要额外 1-2 个字节记录字符串长度。
- 适用场景:长度可预估的字符串,如用户名、标题。
2. text
- 专门用于存储大文本数据。
- 不需要指定长度,但 mysql 有四种 text 类型:
类型 最大长度 tinytext 255 字节 text 65,535 字节 mediumtext 16,777,215 字节 longtext 4,294,967,295 字节 - text 不支持默认值。
- 适用场景:文章正文、评论、描述等大文本。
二、varchar 和 text 的主要区别
对比项 | varchar | text |
---|---|---|
存储方式 | 存储在 行内(页内),长度小于页大小(16kb) | 存储在 独立溢出页,行内只保存指针(20字节) |
最大长度 | 受表行大小限制(理论 65535 字节) | text 类型分为 tinytext ~ longtext |
是否需要指定长度 | 需要(如 varchar(255)) | 不需要(直接使用 text) |
默认值支持 | 支持 | 不支持 |
是否可以创建索引 | 可以,且索引长度可以完整覆盖 | 可以,但必须指定前缀长度(如 index(title(100)) ) |
占用存储 | 字符串实际长度 + 1 或 2 字节长度信息 | 只存储 20b 指针,数据在溢出页 |
性能 | 访问速度快(行内存储) | 较慢(需要额外读取溢出页) |
适合场景 | 用户名、邮箱、标题 | 评论、正文、描述 |
三、存储结构差异
varchar
- 数据直接存储在 页(page)中,行内存储。
- 页大小默认 16kb,如果 varchar 太大(> 16kb),会使用页外存储(类似 text)。
text
- text 类型采用 页外存储:
- 行内存储 20 字节指针,指向溢出页。
- 实际数据存储在 溢出页(overflow page)。
- 因此 text 类型访问需要 额外一次 i/o,性能略差。
四、索引方面的区别
- varchar:
- 可以直接创建完整索引。
- 适合做主键或联合索引。
- text:
- 必须指定索引前缀长度,否则报错:
create index idx_text on articles(content(100));
- 无法作为主键(主键必须 not null 且有默认值)。
五、内存占用差异
- varchar(n):需要额外 1-2 字节存储长度信息。
- n ≤ 255,用 1 字节。
- n > 255,用 2 字节。
- text:只存储一个 20b 指针在行内,实际数据在页外。
六、应用场景对比
场景 | 推荐类型 |
---|---|
用户名、邮箱、标题 | varchar(50~255) |
文章正文、长评论 | text(或 mediumtext) |
大量短文本,需频繁查询 | varchar |
大字段,偶尔查询 | text |
七、限制与注意事项
- text 字段不能有默认值。
- text 字段不能直接排序,需要指定前缀:
select * from articles order by substring(content, 1, 100);
- text 字段不能设置 fulltext 索引,除非引擎支持(innodb 5.6+)。
- varchar 受行大小限制,单行最大 65535 字节(不包括 blob/text 外存数据)。
八、面试高频问答
q1:varchar 和 text 的存储方式区别?
- varchar 存储在页内(行内)。
- text 存储在溢出页,行内只保留指针。
q2:text 字段为什么不能有默认值?
- 因为 text 存储结构特殊,mysql 没有为其分配默认值空间。
q3:text 可以建索引吗?
- 可以,但必须指定前缀长度。
q4:text 查询为什么比 varchar 慢?
- text 存储在溢出页,访问时需要额外 i/o。
q5:什么时候选择 text?
- 当字段内容长度不确定且可能非常大,比如文章正文、长评论。
九、总结
维度 | varchar | text |
---|---|---|
存储方式 | 行内 | 页外 |
是否指定长度 | 必须 | 不需要 |
默认值支持 | 支持 | 不支持 |
索引支持 | 完整支持 | 必须指定前缀 |
性能 | 高 | 较低 |
适用场景 | 短字符串 | 长文本 |
实践:
- 如果字段长度可以预估(如用户名、邮箱、标题):用 varchar。
- 如果字段内容超大且不确定:用 text。
到此这篇关于mysql中varchar和text的区别的文章就介绍到这了,更多相关mysql varchar text内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
发表评论