varchar 与 char 的区别?

在数据库中,VARCHARCHAR 都是用于存储字符串的数据类型,但它们在存储方式、空间占用和适用场景上有本质区别。以下是核心对比:


1. 存储方式与空间占用

特性CHARVARCHAR
存储方式定长存储变长存储
空间分配固定长度(声明长度)实际数据长度 + 长度前缀(1-2字节)
未用空间用空格填充剩余长度,占用固定空间仅存储实际数据,无空间浪费
示例CHAR(10) 存储 "abc" → 占用 10字节VARCHAR(10) 存储 "abc" → 占用 3字节+长度前缀

2. 性能对比

场景CHARVARCHAR
读取速度✅ 更快(固定长度,直接定位)⚠️ 稍慢(需解析长度前缀)
更新速度⚠️ 若新数据长度不变则快,否则需重写整行✅ 更灵活(允许长度变化)
存储碎片✅ 不易产生碎片⚠️ 频繁更新变长数据可能产生碎片

3. 长度限制

类型最大长度说明
CHAR255字符(MySQL)超过时自动转换为 TEXT 类型
VARCHAR65,535字节(MySQL,受行大小限制)UTF8 编码下约 21,844 个汉字

4. 适用场景

优先用 CHAR 的情况
  • 存储长度固定的数据(如 MD5 哈希值、邮编、国家代码)
    country_code CHAR(2)  -- 固定2字符(如 CN/US)
    
  • 频繁更新且长度不变的数据(减少碎片)
  • 需要精确长度比较的场景(无尾部空格问题)
优先用 VARCHAR 的情况
  • 存储长度变化大的数据(如用户名、地址、描述文本)
    username VARCHAR(50)  -- 长度在1~50之间变化
    
  • 节省存储空间(尤其是大表或长文本)
  • 数据尾部空格需保留的场景(CHAR 会自动截断尾部空格)

关键区别总结

对比维度CHARVARCHAR
存储机制定长(空格填充)变长(仅存有效字符)
空间效率低(可能浪费空间)高(按需分配空间)
读取性能高(无需计算长度)中(需解析长度前缀)
尾部空格自动移除(检索时丢失)保留原样
索引效率高(适合固定长度索引)中(索引计算稍复杂)

经典示例分析

存储字符串 "SQL"(实际长度=3字节)
CREATE TABLE test (
  fixed CHAR(10),   -- 占用 10 字节
  dynamic VARCHAR(10) -- 占用 3字节 + 1字节长度前缀 = 4字节
);
  • 存储空间CHAR(10)VARCHAR(10)2.5倍
  • 存储内容
    • CHAR"SQL       "(补7空格)
    • VARCHAR"SQL"(原样存储)

选择建议

  1. 固定长度数据CHAR
    (如 UUID手机号枚举代码
  2. 长度变化 ≤ 20%CHAR
    (减少碎片,提升读取速度)
  3. 长度变化大或长文本VARCHAR
    (如 文章内容用户评论
  4. 存储敏感型尾部空格VARCHAR
    CHAR 会丢失原始空格)

💡 终极原则

  • 追求 性能长度固定CHAR
  • 追求 空间效率长度不定VARCHAR
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值