网站首页 > 技术文章 正文
文章目录
- 前言
- 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则更好,效率影响不是很大。感兴趣的朋友可以进行关注头条号留言讨论,欢迎点赞,转赞,赞赏。
猜你喜欢
- 2025-07-02 「嵌入式秘术」相约榨干SysTick的每一滴汁水
- 2025-07-02 WIDECHAR函数教程(widechar函数没有为什么)
- 2025-07-02 计算机二级考试(计算机二级考试费用)
- 2025-07-02 Mysql中int(10)和char(10)以及varchar(10)区别
- 2025-07-02 MySQL选择合适的数据类型(char与varchar|text与blob)
- 2025-07-02 在 WinCC 中如何显示和操作 S7-300/400 中的 CHAR 和 STRING 类型的数据
- 2025-07-02 在 WinCC 中操作 S7-1200/1500 中的 CHAR 和 STRING 类型的数据
- 2025-07-02 varchar和char到底用哪个呢?(varchar跟char)
- 2025-07-02 to_char()、to_date()的区别(to_date和to_timestamp)
- 2025-07-02 8、char为什么能存贮一个汉字?(char为什么能存储汉字)
- 最近发表
-
- count(*)、count1(1)、count(主键)、count(字段) 哪个更快?
- 深入探索 Spring Boot3 中 MyBatis 的 association 标签用法
- js异步操作 Promise fetch API 带来的网络请求变革—仙盟创梦IDE
- HTTP状态码超详细说明_http 状态码有哪些
- 聊聊跨域的原理与解决方法_跨域解决方案及原理
- 告别懵圈!产品新人的接口文档轻松入门指南
- 在Javaweb中实现发送简单邮件_java web发布
- 优化必备基础:Oracle中常见的三种表连接方式
- Oracle常用工具使用 - AWR_oracle工具有哪些
- 搭载USB 3.1接口:msi 微星 发布 990FXA Gaming 游戏主板
- 标签列表
-
- cmd/c (90)
- c++中::是什么意思 (84)
- 标签用于 (71)
- 主键只能有一个吗 (77)
- c#console.writeline不显示 (95)
- pythoncase语句 (88)
- es6includes (74)
- sqlset (76)
- apt-getinstall-y (100)
- node_modules怎么生成 (87)
- chromepost (71)
- flexdirection (73)
- c++int转char (80)
- mysqlany_value (79)
- static函数和普通函数 (84)
- el-date-picker开始日期早于结束日期 (76)
- js判断是否是json字符串 (75)
- asynccallback (71)
- localstorage.removeitem (74)
- vector线程安全吗 (70)
- java (73)
- js数组插入 (83)
- mac安装java (72)
- 查看mysql是否启动 (70)
- 无效的列索引 (74)