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

MySQL如何选择CHAR和VARCHAR字段类型?

星明酱_1875

星明酱_1875

发布时间:2026-09-02 09:09:25

|

643人浏览过

|

来源于php中文网

原创

必须用CHAR:固定长度标识符(如国家代码CHAR(2)、MD5值CHAR(32))、高频排序/分组的短字符串、千万级表中用于等值查询的紧凑索引字段;其余场景优先VARCHAR。

mysql如何选择char和varchar字段类型?

CHAR 和 VARCHAR 不是“哪个更好”,而是“哪个更合适”——关键看字段内容长度是否稳定、是否对空格敏感、是否高频参与排序或索引查找。


什么时候必须用 CHAR?

CHAR 的优势只在极少数场景成立,用错反而拖慢性能:

  • 存储固定长度标识符:如国家代码 CHAR(2)("CN"、"US")、MD5哈希值 CHAR(32)、UUID短格式(去掉横线后32位)
  • 列值长度几乎恒定且 ≤ 255 字符,比如状态码 CHAR(3)("OK "、"ERR"、"PND"),注意尾部空格会被自动截断(除非开启 pad_char_to_full_length)
  • 高频 ORDER BY 或 GROUP BY 的短字符串字段,CHAR 能避免每次解析长度前缀,减少 CPU 开销
  • 表数据量极大(千万级以上)且该字段常用于等值查询(如 WHERE code = 'US'),CHAR 索引更紧凑,B+树层级更浅

不要因为“听说 CHAR 快”就滥用。例如把用户名定义成 CHAR(50),实际平均长度才 8,等于每行浪费 42 字节 × 百万行 → 多占 42MB 内存+磁盘,还放大 buffer pool 压力。


什么时候优先选 VARCHAR?

绝大多数业务字段都该用 VARCHAR,尤其当:

  • 字段长度变化明显:用户名、地址、标题、描述等
  • 实际平均长度远小于定义上限(比如 VARCHAR(255) 中 95% 的值 ≤ 30 字符)
  • 需要保留末尾空格:VARCHAR 存什么取什么;CHAR 检索时默认 trim 掉尾部空格(SQL 标准行为)
  • 使用 utf8mb4 字符集:中文/emoji 单字符最多占 4 字节,CHAR(10) 固定分配 40 字节,而 VARCHAR(10) 最多只用 40 字节 + 1 字节长度标识,短内容节省显著

注意两个坑:

MySQL
MySQL

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

下载
  • VARCHAR(255) 和 VARCHAR(1000) 在存储相同短字符串时开销一样,但前者会让 MySQL 优化器误判内存需求,可能拒绝使用内存临时表做 GROUP BY
  • InnoDB 行最大限制是 65535 字节(所有列总和),VARCHAR 的长度声明计入这个上限 —— 即使你只存 1 字符,VARCHAR(65535) 本身就会让建表失败(还要预留 NULL 标志、长度标识等)

CHAR 的空格行为到底怎么算?

这是最容易踩的语义坑:

  • 插入时:CHAR(5) 插入 'a' → 存为 'a '(4 个空格填充)
  • 查询时:SELECT 返回结果默认 去掉尾部空格,所以 SELECT code FROM t WHERE code = 'a' 能命中,但 SELECT code FROM t WHERE code = 'a ' 也能命中(因为比较前会 pad 对齐)
  • 比较逻辑:MySQL 按照“补齐到等长再比”的规则,所以 'a' = 'a ' 为 true,但 'a ' = 'a ' 也为 true —— 这不是 bug,是 SQL 标准
  • 如果业务真依赖末尾空格(极少见),必须用 VARCHAR,或全局设置 sql_mode=PAD_CHAR_TO_FULL_LENGTH(MySQL 8.0+ 支持,但会影响所有 CHAR 列)

别靠 LENGTH() 或 TRIM() 来“修复”——根源是类型选错了。


长度设多少才算合理?

没有“安全上限”,只有“最小够用”:

  • 查历史数据,统计该字段的 MAX(LENGTH()),再加 10%~20% 余量(防未来扩展)
  • 避免拍脑袋写 VARCHAR(255) 或 VARCHAR(1024):它不省空间,反而影响执行计划
  • 如果字段可能超 255 字符,且多数值 > 255,考虑 TEXT(但要注意 TEXT 不能有默认值、索引只能前缀、排序必走磁盘临时表)
  • CHAR(1) 存性别('M'/'F')比 TINYINT 更直观,但不如 ENUM('M','F') 省空间(不过 ENUM 有维护成本)

真正伤性能的从来不是类型本身,而是“用 CHAR(20) 存 3 字符邮箱”这种空间浪费,以及“用 VARCHAR(5000) 存日志摘要”导致 optimizer 放弃内存排序。

热门AI工具

更多
UP简历
UP简历 Hot

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

火山引擎

火山引擎是一款面向企业的云计算与AI服务平台。

AionClaw
AionClaw Hot

AionClaw是一款面向办公、创作和编程任务的AI桌面智能体。

豆包大模型

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

DeepSeek

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

音述AI
音述AI Hot

一款AI音频处理工具,主要用于音述AI是一个以“用声音述说故事”为核心的 AI 音乐创作与声音分享社区,适合需要提升相关任务效率的用户。

Loomy
Loomy Hot

一款AI工具,主要用于科大讯飞发布的桌面级 AI 助理,比 OpenClaw 更易用、更安全!,适合需要提升相关任务效率的用户。

PixPix
PixPix Hot

PixPix是一款面向电商视觉生产的AI商品图生成工具。

WorkBuddy

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

相关专题

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

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

2053

2023.06.20

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

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

1259

2023.06.21

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

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

735

2023.07.18

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

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

2712

2023.07.19

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

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

4508

2023.07.25

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

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

1059

2023.08.08

sqlserver和mysql区别
sqlserver和mysql区别

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

4771

2023.08.11

mysql忘记密码
mysql忘记密码

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

4282

2023.08.14

LLVM自定义Pass怎么写
LLVM自定义Pass怎么写

本专题聚焦LLVM自定义Pass开发,整理Pass类结构、run()方法、PreservedAnalyses、CMake构建、插件注册、-load-pass-plugin加载和测试用例编写流程。

20

2026.09.30

热门下载

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

精品课程

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

共1课时 | 178人学习

使用phpenv集成环境安装极致CMS
使用phpenv集成环境安装极致CMS

共2课时 | 282人学习

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

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