mysql中char和varchar的区别

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
云数据库 RDS PostgreSQL,集群系列 2核4GB
简介: mysql中char和varchar的区别

主要区别

char和varchar都是用于在数据库中存储字符串的数据类型。它们之间的主要区别在于存储空间的使用方式。

  • char是一种定长的数据类型,它的长度固定且在存储时会自动在结尾添加空格来将字符串填满指定的长度。char的长度范围是0-255
  • varchar是一种可变长度的数据类型,它只会存储实际的字符串内容,不会填充空格。因此,在存储短字符串时,varchar可以节省空间。varchar的长度范围是0-65535 (MySQL 5.0.3之后的版本)

具体区别

列类型

存储方式

存储空间 性能 默认填充
CHAR 固定长度的字符类型 对于CHAR(n),n表示字符的最大长度。无论实际存储的内容长度是多少,都会占用n个字符长度的存储空间。 由于固定长度,读取和存储时速度相对较快。但是,使用CHAR会浪费存储空间,尤其是对于存储长度不确定的数据。 如果存储的字符串长度小于定义的长度,将使用空格进行右填充,使其达到指定长度。
VARCHAR 可变长度的字符类型 对于VARCHAR(n),n表示字符的最大长度。实际存储的内容长度加上1或2个字节的开销(取决于字符集)。 由于可变长度,读取和存储时需要动态分配存储空间,稍微慢一些。但是,VARCHAR适用于存储长度不确定的数据,可以节省存储空间。 不会进行填充,实际存储的长度与字符串长度一致。

如果使用char(100),则插入记录后就分配了100个字节,后续修改不会造成页分裂的问题,而varchar(100)由于没有提前分配存储空间,因为表中数据刚开始插入时,可变长度字段值都是根据实际长度存储下来的,且行与行之间数据也是紧密连续存放在文件地址中的。那么现在值变长了,原来的位置无法扩展出新的空间出来,所以无法覆盖存放到原来的位置上。此时MySQL就会使用页分裂的方法展字段变长的空间

场景举例

列类型 举例
CHAR 性别(1位),手机号(11位),身份证号(18位)、订单号(固定长度)
VARCHAR 产品描述 (可变长度) 、存储用户地址 (可变长度) 、存储用户名称 (可变长度)

 优缺点

列类型 优点 缺点
CHAR 固定长的字符串类型,减少内存碎片,并且无需额外的磁盘空间去存储长度信息 会删除末尾的空格信息,例如一个char(8)存储 "mijiu "和 “mijiu”他会丢失前者末尾的空格信息,两者存储的都是 “mijiu   ”
VARCHAR 可变长的字符串类型,兼容性更好 可能会产生内存碎片、varchar会额外需要1到2个字节存储长度信息、以及update语句可能会导致页分裂等
相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
24天前
|
存储 关系型数据库 MySQL
ES的全文索引和MySQL的全文索引有什么区别?如何选择?
【8月更文挑战第26天】ES的全文索引和MySQL的全文索引有什么区别?如何选择?
96 5
|
6天前
|
存储 Oracle 关系型数据库
Oracle和MySQL有哪些区别?从基本特性、技术选型、字段类型、事务、语句等角度详细对比Oracle和MySQL
从基本特性、技术选型、字段类型、事务提交方式、SQL语句、分页方法等方面对比Oracle和MySQL的区别。
Oracle和MySQL有哪些区别?从基本特性、技术选型、字段类型、事务、语句等角度详细对比Oracle和MySQL
|
1月前
|
前端开发 关系型数据库 MySQL
com.mysql.jdbc.Driver 和 com.mysql.cj.jdbc.Driver 的区别
这篇文章讨论了`com.mysql.jdbc.Driver`和`com.mysql.cj.jdbc.Driver`两个MySQL驱动类的区别,指出`com.mysql.jdbc.Driver`适用于MySQL 5的`mysql-connector-java`版本,而`com.mysql.cj.jdbc.Driver`适用于MySQL 6及以上版本的`mysql-connector-java`。文章还提到了在实际使用中如何根据MySQL版本选择合适的驱动类。
com.mysql.jdbc.Driver 和 com.mysql.cj.jdbc.Driver 的区别
|
1月前
|
存储 SQL 关系型数据库
OceanBase与MySQL有何区别?
【8月更文挑战第12天】OceanBase与MySQL有何区别?
144 3
|
20天前
|
存储 数据管理 数据库
|
22天前
|
SQL 关系型数据库 MySQL
Mysql中from多表跟join表的区别
Mysql中from多表跟join表的区别
54 0
|
24天前
|
关系型数据库 MySQL
Mysql中count(1)、count(*)以及count(列)的区别
Mysql中count(1)、count(*)以及count(列)的区别
29 0
|
26天前
|
关系型数据库 MySQL 数据库
MySQL MVCC和间隙锁有什么区别?
【8月更文挑战第24天】MySQL MVCC和间隙锁有什么区别?
34 0
|
2月前
|
SQL 关系型数据库 MySQL
MySQL删除表数据、清空表命令(truncate、drop、delete 区别)
MySQL删除表数据、清空表命令(truncate、drop、delete区别) 使用原则总结如下: 当你不需要该表时(删除数据和结构),用drop; 当你仍要保留该表、仅删除所有数据表内容时,用truncate; 当你要删除部分记录、且希望能回滚的话,用delete;
|
1月前
|
存储 关系型数据库 MySQL
在 MySQL 中使用 CHAR
【8月更文挑战第11天】
32 0