背景

学过MySQL的同学都知道MySQL中varchar和char是两种最主要的字符串类型,varchar是变长的类型,而char是固定长度。那关于如何选择类型就成为令人头疼的事,很多初学者为了保证业务兼容性强,存储字符串类型一律都是varchar类型。这是不妥的,需要根据varchar和char的特性来进行选择。

varchar和char数据类型的区别

varchar类型用于存储可变长的字符串,是比较常见常用的字符串数据类型,在存储的字符串是变长时,varchar更加节约空间。由于varchar是变长的,在使用update的时候,可能使得行变得比原来更长,这就导致需要做额外的工作。如果一个行占用的空间增加,并且在页内没有多余的空间可与存储,这是innoDB的存储引擎需要分裂页来使行可以放进页内。

char类型是定长的。在存储数据时,MySQL会删除所有文末的空格,所以,即便你存储的是:'abc ',注意这个字符串末尾是有空格的,也会在存储时把这个空格删掉,这点需要注意。

适用的场景

varchar适用的场景:

  • 字符串列的最大长度比平均长度要大很多;
  • 字符串列的更新很少时,因为没有或很少有内存碎片问题;
  • 使用了UTF-8这样复杂的字符集,每个字符都使用不同的字节数进行存储;

char适用的场景:

  • 列的长度为定值时适合适用,比如:MD5密文数据

varchar和char的优缺点

varchar的优点:

  • 变长的字符串类型,兼容性更好

varchar的缺点:

  • 使用varchar可能会产生内存碎片
  • varchar会额外需要1到2个字节存储长度信息
  • update语句可能会导致页分裂

char的优点:

  • 定长的字符串类型,减少内存碎片
  • 无需额外的内存空间去存储长度信息

char的缺点:

  • 会删除列末尾的空格信息

参考:

《高性能MySQL第3版》第四章

MySql中varchar和char,如何选择合适的数据类型?的更多相关文章

  1. MySQL中varchar与char区别

    MySQL中varchar与char区别(转) MySQL中varchar最大长度是多少? 一. varchar存储规则: 4.0版本以下,varchar(20),指的是20字节,如果存放UTF8汉字 ...

  2. Mysql中varchar和char区别

    一.varchar和char的区别: 区别一:定长和变长 char表示定长.长度固定,varchanr表示变长,即长度可变. 即char类型是规定多少字长则必须存储多少字长,超过的长度的字段则只能截取 ...

  3. mysql 中Varchar 与char的区别

    一.字符与字节与编码关系 ASCII码中,一个英文字母(不分大小写)占一个字节的空间,一个中文汉字占两个字节的空间.一个二进制数字序列,在计算机中作为一个数字单元,一般为8位二进制数,换算为十进制.最 ...

  4. mysql中varchar和char区别(思维导图整理)

    由于mysql一直是我的弱项(其实各方面我都是很弱的),所以最近在看msyql,正好看到varchar和char区别,所以整理一下,便于以后遗忘. 0.0图片已经说明一切,但是系统说我字数不够,我真能 ...

  5. MySQL中varchar与char的区别以及varchar(50)中的50代表的涵义

     varchar与char的区别: 1).varchar与char的区别char是一种固定长度的类型,varchar则是一种可变长度的类型 尽可能的使用 varchar 代替 char ,因为首先变长 ...

  6. MySQL中VARCHAR与CHAR格式数据的区别

    区别 CHAR与VARCHAR类型类似,但它们保存和检索的方式不同.CHAR有固定的长度,而VARCHAR属于可变长的字符类型.它们最大长度和是否尾部空格被保留等方面也不同.在存储和检索过程中不进行大 ...

  7. 浅谈mysql中varchar(m)与char(n)的区别与联系

    mysql建表长度的限制 在mysql建表时,出现以下报错信息: 错误一:行大小过大,所使用的表这种类型的最大的行大小,不算BLOB类型,是65535.(这是我翻译的)    原因是MySQL在建表的 ...

  8. MySQL中varchar类型在5.0.3后的变化

    1.mysql varchar类型变化:mysql 5.0.3 之前: 0--255字节 varchar(20)中的20表示字节数,如果存放urf8编码的话只能放6个汉字. MySQL 5.0.3 之 ...

  9. (1.1)mysql 选择合适的数据类型

    (1.1)mysql 选择合适的数据类型 1.char与varchar [1.1]char 在内容未满定义长度时,做空格填充,且字符串末尾空格会被截断:超出定义长度也会被截断.  如:char(4)  ...

随机推荐

  1. CBV、正则

    CBV(源码分析) from flask import Flask, views app = Flask(__name__) class IndexView(views.MethodView): me ...

  2. Django中间件之SessionMiddleware源码分析

    settings.py文件中 MIDDLEWARE = [ 'django.contrib.sessions.middleware.SessionMiddleware', ] # from djang ...

  3. maven打包(jar)类型错误

    maven项目打包测试环境时部署发现是开发环境.确认打包命令无误, 此情况下将target内容全部删除,重新打包即可.是全部删除.

  4. 研究生杂谈-1粗粒度(Coarse-grained)VS细粒度(fine-grained)

    粒度似乎是根据项目模块划分的细致程度区分的,一个项目模块(或子模块)分得越多,每个模块(或子模块)越小,负责的工作越细,就说粒度越细,否则为粗粒度. 简而言之: 粗粒度:模块的功能太过于集中. 细粒度 ...

  5. svn提交代码出错

    今天提交代码的时候一直报错,下面是错误信息 Error: Commit failed (details follow):  Error: Commit blocked by pre-commit ho ...

  6. 使用 IIS 新建WebService站点供Android访问远程sqlserver数据库

    新增网站 打开IIS控制台,找到服务根目录,右键,新建网站 网站设定 浏览测试 使用刚才生成的默认HelloWorld的服务1页面,记得加上端口号 http://localhost:8090/serv ...

  7. K8S环境的Jenkin性能问题处理续篇(任务Pod设置)

    欢迎访问我的GitHub 这里分类和汇总了欣宸的全部原创(含配套源码):https://github.com/zq2599/blog_demos K8S环境的Jenkin性能问题处理 本文是<K ...

  8. 【题解】小Z的袜子

    期末考试结束了,来写写blog吧 题目描述 作为一个生活散漫的人,小Z每天早上都要耗费很久从一堆五颜六色的袜子中找出一双来穿.终于有一天,小Z再也无法忍受这恼人的找袜子过程,于是他决定听天由命-- 具 ...

  9. 题解【[USACO18FEB]New Barns 】

    浅谈一下对于这题做完之后的感受(不看题解也是敲不出来啊qwq--) 题意翻译 Farmer John注意到他的奶牛们如果被关得太紧就容易吵架,所以他想开放一些新的牛棚来分散她们. 每当FJ建造一个新牛 ...

  10. Spring Boot入门系列(二十)快速打造Restful API 接口

    spring boot入门系列文章已经写到第二十篇,前面我们讲了spring boot的基础入门的内容,也介绍了spring boot 整合mybatis,整合redis.整合Thymeleaf 模板 ...