当前位置: 首页 > news >正文

mysql学习笔记(1)--varChar和char类型的区别

  前言:下面的描述假设使用的存储引擎是InnoDB和/或者MyISAM。如果使用的不是这两种存储引擎,请参考所使用的存储引擎的文档。

  varchar

  varchar类型存储的是可变长字符串。它比定长字符串更节省空间,因为它只使用必要的空间(越短的字符串使用越少的空间)。有一种情况例外,如果mysql表使用ROW FORMAT=FIXED创建的话,每一行都会使用定长存储,这会很浪费存储空间。

  varchar需要使用1或2个额外字节记录字符串的长度:如果列的最大长度<=255个字节,则只需要1的字节表示,否则用2个字节。

  varchar节省了存储空间,所以对性能也有帮助。但是,由于行是变长的,在update时可能使行变得比原来更长,这就导致需要做额外的工作。如果一行占用的空间增长而没有更多的空间存储,就会分裂存储,产生碎片。

  适合使用varchar类型的情况:字符串列的最大长度比平均长度大很多;列的更新很少,所以碎片不是问题;使用了像utf-8这样复杂的字符集,每个字符都是用不同的字节进行存储。

  

  char 

  char类型是定长的:char总是根据定义的字符串长度分配足够的存储空间。当存储char值时,mysql会删除所有末尾空格。char值会根据需要采用空格进行填充以方便比较。

  char适合存储很短的字符串,或者所有值都接近同一个长度。例如:char非常适合存储密码的MD5值,因为这是一个定长的值。对于经常变更的数据,char也比varchar更好,因为定长的char不容易产生碎片。对于非常短的列,char也比varchar在存储空间上效率更高。例如char(1)来存储只有Y和N的值,如果采用单字节字符集只需要一个字节,但是varchar(1)却需要两个字节,因为还有一个记录长度的额外字节。

 

 

  问题:

  使用varchar(5)和char(200)存储“hello”的空间开销是一样的。那么使用更短的列有什么优势吗?

  答:事实证明有很大的优势。更长的列会消耗更多的内存,因为MySQL通常会分配固定的内存块来保存内部值。尤其是使用内存临时表进行排序或者操作会特别糟糕。在利用磁盘临时表进行排序也同样会很糟糕。

  所以最好的策略是只分配真正需要的内存。

转载于:https://www.cnblogs.com/xiaovw/articles/8370782.html

相关文章:

  • etcd raft library
  • jQuery数组去重复
  • Nginx 配置文件重写
  • python------并发编程
  • freebsd安装python2
  • js为什么是单线程的?10分钟了解js引擎的执行机制
  • 鸟哥的linux私房菜学习-(十)vim程序编辑器
  • Linux上vi编辑文件非正常退出后文件恢复
  • 常用网络技术
  • javascript脚本混淆
  • gf框架之grpool - 高性能的goroutine池
  • 谷歌浏览器如何调试JS
  • CocosCreator引擎修改与定制
  • 新年的展望,2018 hello world~
  • Collection---CopyOnWrite(应用于大量度 而少量写的场景)
  • Android 控件背景颜色处理
  • django开发-定时任务的使用
  • es6要点
  • Go 语言编译器的 //go: 详解
  • Invalidate和postInvalidate的区别
  • k8s 面向应用开发者的基础命令
  • Phpstorm怎样批量删除空行?
  • Spark RDD学习: aggregate函数
  • Vue组件定义
  • 腾讯优测优分享 | 你是否体验过Android手机插入耳机后仍外放的尴尬?
  • 我从编程教室毕业
  • 在Unity中实现一个简单的消息管理器
  • 智能网联汽车信息安全
  • 【运维趟坑回忆录】vpc迁移 - 吃螃蟹之路
  • 完善智慧办公建设,小熊U租获京东数千万元A+轮融资 ...
  • 支付宝花15年解决的这个问题,顶得上做出十个支付宝 ...
  • 直播平台建设千万不要忘记流媒体服务器的存在 ...
  • ​什么是bug?bug的源头在哪里?
  • #Linux(Source Insight安装及工程建立)
  • $.ajax,axios,fetch三种ajax请求的区别
  • (32位汇编 五)mov/add/sub/and/or/xor/not
  • (C语言)编写程序将一个4×4的数组进行顺时针旋转90度后输出。
  • (react踩过的坑)antd 如何同时获取一个select 的value和 label值
  • (多级缓存)多级缓存
  • (二十五)admin-boot项目之集成消息队列Rabbitmq
  • (分享)自己整理的一些简单awk实用语句
  • (附源码)node.js知识分享网站 毕业设计 202038
  • (附源码)spring boot儿童教育管理系统 毕业设计 281442
  • (附源码)spring boot建达集团公司平台 毕业设计 141538
  • (附源码)计算机毕业设计ssm基于Internet快递柜管理系统
  • (免费领源码)python#django#mysql公交线路查询系统85021- 计算机毕业设计项目选题推荐
  • (南京观海微电子)——I3C协议介绍
  • (十)c52学习之旅-定时器实验
  • (原創) 如何使用ISO C++讀寫BMP圖檔? (C/C++) (Image Processing)
  • (转)如何上传第三方jar包至Maven私服让maven项目可以使用第三方jar包
  • .bat批处理(三):变量声明、设置、拼接、截取
  • .net web项目 调用webService
  • .net 发送邮件
  • .NET 设计一套高性能的弱事件机制
  • .NET 应用启用与禁用自动生成绑定重定向 (bindingRedirect),解决不同版本 dll 的依赖问题