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

MySQL 中 char 与 varchar 的区别

在 MySQL 的字段类型中,charvarchar是用来处理字符串。本文来学习二者区别

一、本质区别:空间分配的 “固执” 与 “灵活”

1. char:空间占满

  • 固定长度特性
    定义时指定长度(如char(10)),无论实际存储内容长短,强制占用固定字节数,不足部分用空格填充。

    • 存储'abc'char(10)中,实际存储为'abc '(7 个空格补位),占用 10 字节。
    • 若字段定义为char(5),存入'hello world'会被截断为'hello'(超过长度直接丢弃)。
    • 查询效率高

2. varchar:可变空间

  • 可变长度特性
    按实际数据长度分配空间,额外用1-2 字节存储长度值(长度≤255 时用 1 字节,>255 时用 2 字节)。
    举例

    • 存储'abc'varchar(255)中,占用3(数据)+1(长度)=4字节。
  • 存储特点

    • 空间利用率高,但写入时需动态分配空间,写入效率略低于 char

二、性能对比:读写速度的 “得” 与 “失”

维度charvarchar
写入性能快(固定位置写入,无需计算长度)稍慢(需计算长度 + 动态分配空间)
读取性能更快(直接按偏移量定位数据)稍慢(需先读长度再取数据)
空间占用高(可能浪费大量空白空间)低(按需分配,空间利用率高)

典型场景对比

  • 若存储手机号(固定 11 位),用char(11)varchar(11)读取更快,且空间浪费可忽略(仅 11 字节)。
  • 若存储用户简介(长度可能 10-1000 字),varchar(1000)char(1000)节省空间。

三、适用场景

1. char

  • 固定长度数据
    • 密码(如 MD5 值固定 32 位)、身份证号、邮政编码等。
    • 优势:避免数据长度不一致导致的索引效率下降,例如char字段的索引查询速度可能更快。
  • 短文本且性能优先
    • 状态字段(如Y/N0/1),用char(1)存储,查询时直接按位置匹配,效率极高。

2. varchar

  • 变长文本
    • 用户名(长度 5-20 字符)、商品描述、地址等长度不固定的数据。
    • 案例:电商平台的商品名称字段,用varchar(200)可覆盖 99% 的场景,且比char(200)节省大量空间。

四、细节

1. 尾部空格

  • char字段会保留尾部空格,可能导致查询失败:

    sql

    -- 存储时为'13812345678'(无空格),查询时带空格会匹配失败
    SELECT * FROM users WHERE phone = '13812345678  '; 
    

    解决方案
    • 插入数据时用TRIM()去空格:INSERT INTO users(phone) VALUES(TRIM(' 13812345678 '));

五、总结

场景判断charvarchar
数据长度是否固定是(如手机号、MD5 值)否(如昵称、地址)
空间敏感程度低(允许固定浪费)高(需节省空间)
查询性能优先级读性能优先(如高频查询字段)写性能或空间优先(如日志数据)

学习记录,如有错误,请大佬指正!

http://www.lryc.cn/news/2401069.html

相关文章:

  • DeepSeek 赋能智能零售,解锁动态定价新范式
  • 在Flutter中定义全局对象(如$http)而不需要import
  • <4>, Qt窗口
  • 6.04打卡
  • 【基于SpringBoot的图书购买系统】操作Jedis对图书图书的增-删-改:从设计到实战的全栈开发指南
  • Ubuntu中TFTP服务器安装使用
  • Spring Boot微服务架构(十):Docker与K8S部署的区别
  • 接口重试的7种常用方案!
  • vue3:Table组件动态的字段(列)权限、显示隐藏和左侧固定
  • pikachu靶场通关笔记13 XSS关卡09-XSS之href输出
  • MCP客户端Client开发流程
  • 学习日记-day21-6.3
  • C语言探索之旅:深入理解结构体的奥秘
  • uniapp 开发企业微信小程序,如何区别生产环境和测试环境?来处理不同的服务请求
  • Dockerfile常用指令介绍
  • Docker 容器化:核心技术原理与实践
  • 不确定性分析在LEAP能源-环境系统建模中的整合与应用
  • 经典算法回顾之最小生成树
  • Ubuntu下实现nginx反向代理
  • c++ QicsTable使用实例
  • 在WordPress上添加隐私政策页面
  • 二维 根据矩阵变换计算镜像旋转角度
  • 你工作中涉及的安全方面的测试有哪些怎么回答
  • 阿里云ACP云计算备考笔记 (3)——云服务器ECS
  • Eigen实现非线性最小二乘拟合 + Gauss-Newton算法
  • 区块链技术:原理、应用与发展趋势
  • 从零开始:用Tkinter打造你的第一个Python桌面应用
  • Web开发主流前后端框架总结
  • Java Spring Boot 自定义注解详解与实践
  • GlobalSign、DigiCert、Sectigo三种SSL安全证书有什么区别?