当前位置: 首页 > news >正文

MySQL 中 VARCHAR 和 TEXT 的区别

在 MySQL 表设计中,字符串字段常用 VARCHARTEXT 类型,但它们在 存储方式、性能、使用限制 等方面存在明显区别。


一、VARCHAR 和 TEXT 基本介绍

1. VARCHAR

  • 可变长度字符串,最大长度由定义决定。
  • 最大长度:0 ~ 65535 字节(受行大小限制)。
  • 存储时需要额外 1-2 个字节记录字符串长度。
  • 适用场景:长度可预估的字符串,如用户名、标题。

2. TEXT

  • 专门用于存储大文本数据。
  • 不需要指定长度,但 MySQL 有四种 TEXT 类型:
    类型最大长度
    TINYTEXT255 字节
    TEXT65,535 字节
    MEDIUMTEXT16,777,215 字节
    LONGTEXT4,294,967,295 字节
  • TEXT 不支持默认值。
  • 适用场景:文章正文、评论、描述等大文本。

二、VARCHAR 和 TEXT 的主要区别

对比项VARCHARTEXT
存储方式存储在 行内(页内),长度小于页大小(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

七、限制与注意事项

  1. TEXT 字段不能有默认值。
  2. TEXT 字段不能直接排序,需要指定前缀:
    SELECT * FROM articles ORDER BY SUBSTRING(content, 1, 100);
    
  3. TEXT 字段不能设置 FULLTEXT 索引,除非引擎支持(InnoDB 5.6+)。
  4. VARCHAR 受行大小限制,单行最大 65535 字节(不包括 BLOB/TEXT 外存数据)。

八、面试高频问答

Q1:VARCHAR 和 TEXT 的存储方式区别?

  • VARCHAR 存储在页内(行内)。
  • TEXT 存储在溢出页,行内只保留指针。

Q2:TEXT 字段为什么不能有默认值?

  • 因为 TEXT 存储结构特殊,MySQL 没有为其分配默认值空间。

Q3:TEXT 可以建索引吗?

  • 可以,但必须指定前缀长度。

Q4:TEXT 查询为什么比 VARCHAR 慢?

  • TEXT 存储在溢出页,访问时需要额外 I/O。

Q5:什么时候选择 TEXT?

  • 当字段内容长度不确定且可能非常大,比如文章正文、长评论。

九、总结

维度VARCHARTEXT
存储方式行内页外
是否指定长度必须不需要
默认值支持支持不支持
索引支持完整支持必须指定前缀
性能较低
适用场景短字符串长文本

实践

  • 如果字段长度可以预估(如用户名、邮箱、标题):用 VARCHAR
  • 如果字段内容超大且不确定:用 TEXT
http://www.dtcms.com/a/315731.html

相关文章:

  • 智慧酒店:科技赋能下的未来住宿新体验
  • Spring-rabbit使用实战六
  • 国产三防平板电脑是什么?三防平板推荐
  • Spark内核调度
  • RTC实时时钟RX8900SA国产替代FRTC8900S
  • 使用maven-shade-plugin解决es跨版本冲突
  • 微信小程序功能实现:页面导航与跳转
  • jenkins插件Active Choices的使用通过参数动态控制多选参数的选项
  • LHA6958D是一款代替AD7606的芯片
  • 【前端】网站favicon图标制作
  • MyBatisPlus查询数据库中所有表的数据(AI)
  • 使标签垂直水平居中的多种方法
  • 自动驾驶控制算法——MPC控制算法
  • 数据结构 实现单链表
  • Vue3核心语法进阶(Props)
  • C语言:选择排序算法深度剖析!
  • nodejs 编码初体验
  • JAVA无人共享球杆柜系统球杆柜租赁系统源码支持微信小程序
  • 嵌入式硬件中运放的基本控制原理
  • 基于k8s环境下的pulsar常用命令(上)
  • 达梦分布式集群DPC_分布式任务执行拆分流程_yxy
  • 安全测绘之敏感网络资产排查指南
  • 在Linux上部署RabbitMQ、Redis、ElasticSearch
  • Taro Hooks 完整分类详解
  • 深度解析随机森林 API:参数奥秘与调优指南
  • 在AI时代,如何制定有效的职业规划?AI时代职业规划+AI产品经理角色
  • 【学习笔记】NTP时间同步验证
  • Kali Linux 2025.2基于MITRE ATTCK框架
  • DPU(数据处理单元)架构中,SoC(系统级芯片)与FPGA(现场可编程门阵列)之间的数据交互
  • 山东移动e企组网技术分析:底层架构与实现方式