MySQL中char和varchar的比较

前言

现在mysql依然是主流的关系型数据库使用首选,实际开发过程当中我们可能很少去考虑两者的区别,一般都是设置的varchar,一般也很少出问题,那他们两者的使用区别到底大不大呢?本篇文章做个梳理总结,希望喜欢的朋友参与讨论,转载。

1.char和varchar的字符比较:

因为mysql字符集设置的不同的原因,所以字符占用多大字节会因为字符集设置有区别,char最大一般是255,varchar如果是utf8mb4字符集则最大为16383,如果是utf8则为:21845,这个确实会变化(mysql一行的最大字节数为65535),有可能也会随着mysql的版本产生变化。需要注意的是:char和varchar设置的数据大小存储为字符数,而不是字节数。

2.存数据的区别:

类型特点备注
char定长如果小于定义的长度,会补空格
vchar变长不会补空格

3.取数据的区别:

类型特点备注
chartrim()去空格
vchar保留空格

注意:对比数据的时候不会考虑尾部的空格

4.测试性能比较:

100万数据样本无索引有索引创建索引耗时
c8=char(8)312.0ms0.271ms2439ms
s8=varchar(8)334.3ms0.2354ms2442ms
i8=(bigint)276.95ms0.2189ms1645ms
c4=char(4)354.95ms0.303ms2296ms
s4=varchar(4)340.45ms0.3094ms2303ms
i4=int(4)291.1ms0.25ms1403ms

结论:

无索引:全表扫描不会因为数据较小就变快,而是整体速度相同,int/bigint作为原生类型稍快12%。
有索引:char与varchar性能差不多,int速度稍快18%

在数据存储、读写方面,整数与等长字符串相同,varchar额外多了一个字节所以性能可能会些许影响(1/n)。
在数据运算、对比方面,整数得益于原生支持,因此会比字符串稍快一丁点。
若采用索引,所谓整数、字符串的性能差距更是微乎其微。

在实际开发中,许多开发者经常使用char(1)、char(4)这样的字符串表示类型枚举,这种做法在存储空间、运算性能、可读性、可维护性、可扩展性方面,远胜于int、enum这种数据类型。
我的总结是当确定长度的时候能使用char则使用,如果确实不是100%确定,那么使用varchar则更好,效率影响不是很大。感兴趣的朋友可以进行关注公众号留言讨论,欢迎点赞,转赞,赞赏。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值