深入理解char和varchar的区别

本文探讨了MySQL中char与varchar的区别,包括存储方式、内存使用情况及应用场景建议。同时对比了静态表与动态表的不同,并介绍了如何通过SQL语句进行相关配置。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

今天在看《mysql性能优化》,偶然发现了一些从不知道的秘密,又去跟同事说,同事不知道,我还没说明白,好尴尬。所以从网上查了一下资料并且开启本地测试库测试。


一、char与varchar

char:分配固定长度。
varchar:根据实际存入值分配空间,可设置最大值。

不同处:
一、存储方式:
char:在空间上分配固定长度,把实际存入的值后面补齐空格,在取出时去掉空格。
varchar:在空间上分配传入值长度 + 记录长度值(1字节,或者2字节),早期版本4.1会剔除空格。[Ps:不知道这个记录长度值什么时候用。]
二、内存:
由于mysql优化,会分配固定大小内存保存内存值。varchar(200)会比varchar(100)占用的内存大,由于varchar会多出记录长度位,varchar(100)会比char(100)占用的内存大。

总结:char占用空间大。内存空间比varchar小一个记录长度位。char因为固定长,储存空间连续。查询速度快。
1,频繁更改的字段不要设置为varchar,可能会出现空间碎片。不同的储存引擎处理方式不一样,MyISAM把行拆成不同的片段储存,Innodb分裂页把行放入页中。
2,确定长度的属性用char。比如:orderId、openId。
3,属性字段长度短时不要用varchar,因为会多存储长度记录位。

二、静态表和动态表

在表属性上可以直接设置表为动态表或者静态表。
动态表:其中的char全部失效,变为varchar。
静态表:其中varchar全部失效,变为char。

// 测试所用sql语句
// 查询表属性值
show table status from datebaseName like 'tableName';

//更改row_format值
ALTER TABLE `student` Row_format = dynamic;

//更改存储引擎
alter table student engine=myisam;

其中Row_format为控制属性。拥有如下值:
[DEFAULT, FIXED(静态), DYNAMIC(动态), COMPRESSED, REDUNDANT, COMPACT ]
InnoDb不支持改变row_format值,默认为COMPACT。
MyIASAM支持,默认为Dynamic。

参考来自:mysql高性能书籍_第3版、大量网页博客

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值