Mysql-CHAR和VARCHAR详解

在 MySQL 中,CHARVARCHAR 是两种用于存储字符串的字段类型,它们的主要区别在于存储方式、长度限制、性能和用途。以下是详细的对比分析:


1. 存储方式

CHAR
  • 定长存储

    CHAR

    会固定分配指定长度的存储空间,无论实际存储的字符串长度是多少。

    • 如果字符串长度小于定义的长度,系统会在右侧用空格填充(用于存储),但检索时会去掉填充的空格。

  • 适用场景:适用于长度固定或接近固定的字符串,比如身份证号、手机号、邮政编码等。

VARCHAR
  • 变长存储

    VARCHAR

    根据实际字符串长度分配存储空间,多余的空间不浪费。

    • 在数据存储时,

      VARCHAR

      会额外占用 1 个或 2 个字节来记录字符串的实际长度。

      • 长度 ≤ 255 字节:使用 1 个字节记录长度。

      • 长度 > 255 字节:使用 2 个字节记录长度。

  • 适用场景:适用于长度不固定的字符串,比如文章内容、用户输入的备注等。


2. 最大长度

CHAR
  • 最大长度为 255 字节

  • 如果定义的长度小于实际存储数据长度,数据会被截断。

VARCHAR
  • 最大长度为 65535 字节(需要考虑表的总行长度限制和字符集影响)。

  • 实际存储长度受以下因素限制:

    • 定义的字段长度。

    • 表的总行大小(受限于 InnoDB 的最大行大小约 65535 字节)。

    • 字符集:如 UTF-8 字符集下,每个字符占用 1-4 字节。


3. 性能

CHAR
  • 性能更高:因为是定长存储,查询和更新操作较快(尤其在频繁修改时),无需额外计算字符串长度。

  • 适合高频查询和写入操作。

VARCHAR
  • 性能稍低:由于是变长存储,涉及额外的长度计算和动态调整存储空间。

  • 在长度变化频繁的场景中,性能可能略逊于 CHAR


4. 存储空间

CHAR
  • 占用的存储空间固定,可能会浪费空间。

    • 例如:CHAR(10) 定义的字段,即使存储 abc,也会占用 10 字节(其余用空格填充)。

VARCHAR
  • 存储空间利用率更高,只占用实际字符所需的字节数,加上 1 或 2 个字节的长度信息。

    • 例如:VARCHAR(10) 存储 abc 只占用 3 字节(加 1 个字节用于长度信息)。


5. 数据完整性

  • CHAR 在存储和检索时自动去除尾部的填充空格,可能会导致某些情况下的数据不一致问题。

    • 示例:

      CREATE TABLE test (col CHAR(5));
      INSERT INTO test VALUES ('abc');
      SELECT col = 'abc'; -- 返回 TRUE
      SELECT col = 'abc  '; -- 也返回 TRUE(忽略了填充的空格)
  • VARCHAR 不会去掉尾部的空格,严格按实际输入存储。

    • 示例:

      CREATE TABLE test (col VARCHAR(5));
      INSERT INTO test VALUES ('abc');
      SELECT col = 'abc'; -- 返回 TRUE
      SELECT col = 'abc  '; -- 返回 FALSE(存储的是原始数据)

6. 应用场景

  • CHAR

    • 固定长度的字符串,例如:

      • 国家代码(ISO 标准代码,如 US, CN

      • 邮政编码

      • 身份证号、手机号等

    • 对性能要求较高,数据长度较短且固定时。

  • VARCHAR

    • 可变长度的字符串,例如:

      • 用户名、邮箱地址

      • 动态文本内容(文章、备注等)

    • 数据长度不确定,存储效率优先时。


7. 对比总结表

特性CHARVARCHAR
存储方式定长变长
最大长度255 字节65535 字节(受行大小限制)
存储效率占用固定长度,可能浪费空间按需分配,节省空间
性能查询和写入更快查询和写入稍慢
尾部空格处理存储时填充,检索时去掉按实际存储,保留尾部空格
适用场景固定长度,频繁查询可变长度,存储空间优先
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Yy_Yyyyy_zz

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值