讲师中心 微信公众号
AI工具推荐 视频效率加速

如何在MySQL中正确选择CHAR和VARCHAR以提升存储效率?

星伟君_1768

星伟君_1768

发布时间:2026-07-08 07:00:18

|

237人浏览过

|

来源于php中文网

原创

必须用CHAR的场景是:字段长度严格固定、字符集下字节数可控、高频等值查询或作索引前导列,且不依赖尾部空格;否则VARCHAR更安全高效,因其按需存储、保留空格、避免填充浪费,并在InnoDB中支持溢出优化。

如何在mysql中正确选择char和varchar以提升存储效率?

短且长度恒定的字段用 CHAR,变化大或普遍偏短的字段用 VARCHAR——选错类型在千万级表里可能多占 30% 存储空间,且拖慢索引定位速度。

什么时候必须用 CHAR?

不是“能用就用”,而是满足以下全部条件时才值得考虑:CHAR 的固定长度优势才能真正兑现:

  • 字段长度严格固定(如 CHAR(2) 存国家代码 'CN'、'US',绝不会是 'USA')
  • 字符集下最大字节数可控(utf8mb4 下 CHAR(2) 最多占 8 字节,不会溢出行限制)
  • 该列高频参与等值查询或作为联合索引前导列(WHERE status = 'A'),此时 CHAR 的地址计算更直接
  • 不依赖尾部空格语义(默认模式下检索会自动 trim,PAD_CHAR_TO_FULL_LENGTH 开启后才保留)

反例:CHAR(32) 存 MD5 值看似合理,但如果业务中存在部分旧数据只存了 16 位或带中间空格,后续比对逻辑极易出错。

为什么 VARCHAR 在大多数场景更安全?

VARCHAR 的可变性不是妥协,而是对现实数据分布的适配。关键点在于它的存储开销和行为可预测:

  • 长度前缀只占 1 字节(≤255 字符)或 2 字节(>255),远小于 CHAR 的填充浪费
  • 插入 'abc' 到 VARCHAR(100),实际只写 4 字节(1 字节长度 + 3 字节内容),不像 CHAR(100) 强制写满 100 字符空间
  • 支持尾部空格原样保留(INSERT INTO t(v) VALUES('a '),查出来仍是 'a ')
  • 在 innodb 的 DYNAMIC 行格式下,超长值自动溢出到独立页,避免单行膨胀影响缓冲池效率

注意:VARCHAR(65535) 不等于“随便设”,它受整行最大 65535 字节限制,且实际可用长度还要减去其他列、隐式字段(如 trx_id、roll_ptr)占用的空间。

MySQL
MySQL

编写正确的MySQL查询,避免字符集、索引和锁方面的常见陷阱。

下载

TEXT 类型不能替代 VARCHAR 来“省事”

看到字段可能很长,就直接上 TEXT?这是典型误用。它带来三重代价:

  • 无法设置默认值(MySQL 8.0.19+ 对 TINYTEXT/TEXT 放宽,但仍有约束)
  • 索引只能建前缀(INDEX(content(100))),且前缀长度超过 1000 字符时,排序/分组性能断崖下跌
  • 查询需二次 I/O:先读主记录拿到 20 字节指针,再跳转到溢出页取真实内容,SELECT content FROM t WHERE id = 123 比同长度 VARCHAR 多一次磁盘寻道

正确做法:若字段平均长度 VARCHAR(1000);仅当明确需要存 >1MB 文本(如日志原始内容、HTML 片段)且极少全量读取时,才考虑 MEDIUMTEXT。

容易被忽略的字符集放大效应

很多人只看 CHAR(10) 或 VARCHAR(10) 的“10”,却忘了 utf8mb4 下一个汉字占 4 字节。这意味着:

  • CHAR(10) 在 utf8mb4 下最多占 40 字节,而 VARCHAR(10) 存 '你好' 只占 1(前缀)+ 8 = 9 字节
  • 同一张表混用 latin1 和 utf8mb4 字段时,CHAR 的“固定”反而成了陷阱——因为字符集不同,相同 CHAR(N) 占用字节数差异巨大,导致行大小估算失准
  • 建表时显式声明字符集,比如 name VARCHAR(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_as_cs,避免继承库级默认值带来的隐式转换开销

真正影响存储效率的从来不是“用不用可变长”,而是你是否清楚每个字符在当前字符集下实际占多少字节、以及这些字节如何被引擎组织进页结构里。

热门AI工具

更多
DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

Atoms
Atoms Hot

Atoms是一款AI智能体工具,第一支自动构建真实业务的 AI 团队。

Seko
Seko Hot

一款AI视频创作工具,主要用于商汤科技推出的创编一体的AI短视频创作Agent,适合需要提升相关任务效率的用户。

PixTV
PixTV Hot

PixTV是一款面向AIGC内容创作的AI视频生成工具。

咔片AIPPT

一款在线AI演示文稿制作工具,可根据主题和内容需求辅助生成PPT结构与页面,提高演示材料制作效率。

二狗PPT
二狗PPT Hot

一款AI演示文稿工具,主要用于专为中式职场打造的AI PPT生成工具,适合需要提升相关任务效率的用户。

UP简历
UP简历 Hot

一款AI办公效率工具,主要用于基于AI技术的免费在线简历制作工具,适合需要提升相关任务效率的用户。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

相关专题

更多
mysql修改数据表名
mysql修改数据表名

MySQL修改数据表:1、首先查看数据库中所有的表,代码为:‘SHOW TABLES;’;2、修改表名,代码为:‘ALTER TABLE 旧表名 RENAME [TO] 新表名;’。php中文网还提供MySQL的相关下载、相关课程等内容,供大家免费下载使用。

2373

2023.06.20

MySQL创建存储过程
MySQL创建存储过程

存储程序可以分为存储过程和函数,MySQL中创建存储过程和函数使用的语句分别为CREATE PROCEDURE和CREATE FUNCTION。使用CALL语句调用存储过程智能用输出变量返回值。函数可以从语句外调用(通过引用函数名),也能返回标量值。存储过程也可以调用其他存储过程。php中文网还提供MySQL创建存储过程的相关下载、相关课程等内容,供大家免费下载使用。

1439

2023.06.21

mongodb和mysql的区别
mongodb和mysql的区别

mongodb和mysql的区别:1、数据模型;2、查询语言;3、扩展性和性能;4、可靠性。本专题为大家提供mongodb和mysql的区别的相关的文章、下载、课程内容,供大家免费下载体验。

855

2023.07.18

mysql密码忘了怎么查看
mysql密码忘了怎么查看

MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,属于 Oracle 旗下产品。MySQL 是最流行的关系型数据库管理系统之一,在 WEB 应用方面,MySQL是最好的 RDBMS 应用软件之一。那么mysql密码忘了怎么办呢?php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

3312

2023.07.19

mysql创建数据库
mysql创建数据库

MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,属于 Oracle 旗下产品。MySQL 是最流行的关系型数据库管理系统之一,在 WEB 应用方面,MySQL是最好的 RDBMS 应用软件之一。那么mysql怎么创建数据库呢?php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

5668

2023.07.25

mysql默认事务隔离级别
mysql默认事务隔离级别

MySQL是一种广泛使用的关系型数据库管理系统,它支持事务处理。事务是一组数据库操作,它们作为一个逻辑单元被一起执行。为了保证事务的一致性和隔离性,MySQL提供了不同的事务隔离级别。php中文网给大家带来了相关的教程以及文章欢迎大家前来学习阅读。

1239

2023.08.08

sqlserver和mysql区别
sqlserver和mysql区别

SQL Server和MySQL是两种广泛使用的关系型数据库管理系统。它们具有相似的功能和用途,但在某些方面存在一些显著的区别。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

5931

2023.08.11

mysql忘记密码
mysql忘记密码

MySQL是一种关系型数据库管理系统,关系数据库将数据保存在不同的表中,而不是将所有数据放在一个大仓库内,这样就增加了速度并提高了灵活性。那么忘记mysql密码我们该怎么解决呢?php中文网给大家带来了相关的教程以及其他关于mysql的文章,欢迎大家前来学习阅读。

5162

2023.08.14

Gradle插件开发入门教程
Gradle插件开发入门教程

本专题介绍Gradle插件开发的基本流程,涵盖插件类编写、自定义任务注册、扩展参数设计和插件应用方法,帮助你理解插件如何组织构建逻辑,减少多个项目之间的重复配置。

80

2026.10.22

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PostgreSQL vs MySQL
PostgreSQL vs MySQL

共1课时 | 192人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn