百度360必应搜狗淘宝本站头条
当前位置:网站首页 > IT技术 > 正文

30.MySQL中char和varchar的比较

wptr33 2025-03-03 20:29 15 浏览

文章目录

    • 前言
      • 1.char和varchar的字符比较:
      • 2.存数据的区别:
      • 3.取数据的区别:
      • 4.测试性能比较:
    • 结论:

前言

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

1.char和varchar的字符比较:

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

2.存数据的区别:

类型

特点

备注

char

定长

如果小于定义的长度,会补空格

vchar

变长

不会补空格

3.取数据的区别:

类型

特点

备注

char

trim()去空格


vchar

保留空格


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

4.测试性能比较:

100万数据样本

无索引

有索引

创建索引耗时

c8=char(8)

312.0ms

0.271ms

2439ms

s8=varchar(8)

334.3ms

0.2354ms

2442ms

i8=(bigint)

276.95ms

0.2189ms

1645ms

c4=char(4)

354.95ms

0.303ms

2296ms

s4=varchar(4)

340.45ms

0.3094ms

2303ms

i4=int(4)

291.1ms

0.25ms

1403ms

结论:

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

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

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

相关推荐

十年之重修Redis原理(redis重试机制)

弱小和无知并不是生存的障碍,傲慢才是。--------面试者...

Redis 中ZSET数据类型命令使用及对应场景总结

1.zadd添加元素zaddkeyscoremember...

redis总结(redis常用)

RedisTemplate封装的工具类packagehk.com.easyview.common.helper;importcom.alibaba.fastjson.JSONObject;...

配置热更新系统(如何实现热更新)

整体设计概览┌────────────┐┌────────────────┐┌────────────┐│配置后台服务│--写入-->│Red...

java高级用法之:调用本地方法的利器JNA

简介JAVA是可以调用本地方法的,官方提供的调用方式叫做JNI,全称叫做javanativeinterface。要想使用JNI,我们需要在JAVA代码中定义native方法,然后通过javah命令...

SpringBoot:如何优雅地进行响应数据封装、异常处理

背景越来越多的项目开始基于前后端分离的模式进行开发,这对后端接口的报文格式便有了一定的要求。通常,我们会采用JSON格式作为前后端交换数据格式,从而减少沟通成本等。...

Java中有了基本类型为什么还要有包装类型(封装类型)

Java中基本数据类型与包装类型有:...

java面向对象三大特性:封装、继承、多态——举例说明(转载)

概念封装:封装就是将客观的事物抽象成类,类中存在属于这个类的属性和方法。...

java 面向对象编程:封装、继承、多态

Java中的封装(Encapsulation)、继承(Inheritance)和多态(Polymorphism)是面向对象编程的三大基本概念。它们有助于提高代码的可重用性、可扩展性和可维护性。...

怎样解析java中的封装(怎样解析java中的封装文件)

1.解析java中的封装1.1以生活中的例子为例,打开电视机的时候你只需要按下开关键,电视机就会打开,我们通过这个操作我们可以去间接的对电视机里面的元器件进行亮屏和显示界面操作,具体怎么实现我们并不...

python 示例代码(python代码详解)

以下是35个python代码示例,涵盖了从基础到高级的各种应用场景。这些示例旨在帮助你学习和理解python编程的各个方面。1.Hello,World!#python...

python 进阶突破——内置模块(Standard Library)

Python提供了丰富的内置模块(StandardLibrary),无需安装即可直接使用。以下是一些常用的内置模块及其主要功能:1.文件与系统操作...

Python程序员如何调试和分析Python脚本程序?附代码实现

调试和分析Python脚本程序调试技术和分析技术在Python开发中发挥着重要作用。调试器可以设置条件断点,帮助程序员分析所有代码。而分析器可以运行程序,并提供运行时的详细信息,同时也能找出程序中的性...

python中,函数和方法异同点(python方法和函数的区别)

在Python中,函数(Function)...

Python入门基础命令详解(python基础入门教程)

以下是Python基本命令的详解指南,专为初学者设计,涵盖基础语法、常用操作和实用示例:Python基本命令详解:入门必备指南1.Python简介特点:简洁易读、跨平台、丰富的库支持...