详见:http://blog.yemou.net/article/query/info/tytfjhfascvhzxcyt337

VARCHAR 和 CHAR 是两种最主要的字符串类型 。不幸的是,很难精确地解释这些值是怎么 存储在磁盘和内存中的,因为这眼存储引擎的具体实现有关 。下面的描述假设使用的存 储引擎是 InnoDB 和 /或者My ISAM。如果使用的不是这两种存储引擎 ,请参考所使用 的存储引擎的文档。

先看看 VARC HAR 和 C HA R 值通常在磁盘上怎么存储 。请注意,存储引擎存储 CHA R 或者 VARC HAR 值的方式在 内存中和在磁盘上可能不一样 ,所以MySQL 服务器从存储引擎读 出的值可能需要转换为另一种存储格式。下面是关于两种类型的一些比较。

VARCHAR

VARCHAR类型用于存储可变长字符串,是最常见的字符串数据类型。它比定长类型

更节省空间,因为它仅使用必要的空间(例如,越短的字符串使用越少的空间)。有一种情况例外,如果MySQL表使用ROW_FORMAT=FIXED创建的话,每一行都会使用定长存储,这会很浪费空间。

VARCHAR需要使用1或2个额外字节记录字符串的长度:如果列的最大长度小于或等于255字节,则只使用1个字节表示,否则使用2个字节。假设采用latinl字符集 ,一个VARC陆R(10)的列需要11个字节的存储空间。VARC陆R(1000)的列则需要1002个字节,因为需要2个字节存储长度信息。

VARCHAR节省了存储空间,所以对性能也有帮助。但是,由于行是变长的,在UPDATE时可能使行变得比原来更长,这就导致需要做额外的工作。如果一个行占用 的空间增长,并且在页内没有更多的空间可以存储,在这种情况下,不同的存储引擎的处理方式是不一样的。例如,MyISAM会将行拆成不同的片段存储,InnoDB 则需要分裂页来使行可以放进页内。其他一些存储引擎也许从不在原数据位置更新数据。

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

在5.0或者更高版本,MySQL在存储和检索时会保留末尾空格。但在4.1或更老的版本,MySQL会剔除末尾空格。

InnoDB则更灵活,它可以把过长的VARC陆R存储为BLOB,我们稍后讨论这个问题。

CHAR

CHAR类型是定长的:MySQL总是根据定义的字符串长度分配足够的空间。当存CHAR值时,MySQL会删除所有的末尾空格(在MySQL4.1和更老版本中VARCHA也是这样实现的一一也就是说这些版本中CHAR和VARCHAR在逻辑上是一样的,别只是在存储格式上)。C陆R值会根据需要采用空格进行填充以方便比较。

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

CHAR 类型的这些行为可能有一点难以理解,下面通过一个具体的例子来说明。首先,我 们创建一张只有一个 C阳刚10) 字段的表井且往里面插入一些值 :

当检索这些值的时候,会发现 string3 末尾的空格被截断了。

如果用 VARCHAR(10) 字段存储相同的值,可以得到如下结果:

数据如何存储取决于存储引擎 ,并非所有的存储引擎都会按照相同的方式处理定长和 变长的字符串 。Memory   引擎只支持定长的行 ,即使有变长字段也会根据最大长度分

配最大空间。不过,填充和截取空格的行为在不同存储引擎都是一样的 ,因为这是在MySQL 服务器层进行处理的 。

与 CHAR 和 VARCHAR 类似的类型还有 BINARY 和 VARBINARY ,它们存储的是二进制字符串 。 二进制字符串眼常规字符串非常相似  ,但是二进制字符南存储的是字节码而不是字符   。 填充也不一样 :MySQL 填充 BINARY 采用的是\0 ( 零字节) 而不是空格 ,在检索时也不 会去掉填充值剧。

当需要存储二进制数据 ,井且希望 MySQL 使用字节码而不是字符进行比较时 ,这些 类型是非常有用的 。二进制比较的优势并不仅仅体现在大小写敏感上 。MySQL 比较 BINARY 字符串时 ,每次按一个字节 ,并且根据该字节的数值进行比较 。因此,二进制比 较比字符比较简单很多 ,所以也就更快。

mysql varchar和char的根本区别深度详解的更多相关文章

  1. MySQL 5.7主从复制从零开始设置及全面详解——实现多线程并行同步,解决主从复制延迟问题!

    MySQL 5.7主从复制从零开始设置及全面详解——实现多线程并行同步,解决主从复制延迟问题!2017年06月15日 19:59:44 蓝色-鸢尾 阅读数:2062版权声明:本文为博主原创文章,如需转 ...

  2. Java日志管理:Logger.getLogger()和LogFactory.getLog()的区别(详解Log4j)

    Java日志管理:Logger.getLogger()和LogFactory.getLog()的区别(详解Log4j) 博客分类: Java综合   第一.Logger.getLogger()和Log ...

  3. Windows8 各种版本区别对比详解

    微软的 Windows8 操作系统提供了4个不同的版本,分别是 Windows RT.Windows 8 标准版.Windows 8 Pro 专业版 以及 Windows 8 Enterprise 企 ...

  4. centos7.2环境nginx+mysql+php-fpm+svn配置walle自动化部署系统详解

    centos7.2环境nginx+mysql+php-fpm+svn配置walle自动化部署系统详解 操作系统:centos 7.2 x86_64 安装walle系统服务端 1.以下安装,均在宿主机( ...

  5. java中4种修饰符访问权限的区别及详解全过程

    java中4种修饰符访问权限的区别及详解全过程 http://jingyan.baidu.com/article/fedf0737700b3335ac8977ca.html java中4中修饰符分别为 ...

  6. 《手把手教你》系列技巧篇(二十七)-java+ selenium自动化测试- quit和close的区别(详解教程)

    1.简介 尽管有的小伙伴或者童鞋们觉得很简单,不就是关闭退出浏览器,但是宏哥还是把两个方法的区别说一下,不然遇到坑后根本不会想到是这里的问题. 2.源码 本文介绍webdriver中关于浏览器退出操作 ...

  7. MySQL varchar和char类型

    varchar和char是两种最主要的字符串类型.不幸的是,很难精确地解释这些值是怎么储存在磁盘和内存中的,因为这根存储引擎的具体实现有关.下面的描述假设使用的存储引擎是InnoDB或者MyISAM. ...

  8. 【夯实Mysql基础】MySQL在Linux系统下配置文件及日志详解

    本文地址 分享提纲: 1. 概述 2. 详解配置文件 3. 详解日志 1.概述 MySQL配置文件在Windows下叫my.ini,在MySQL的安装根目录下:在Linux下叫my.cnf,该文件位于 ...

  9. Mybatis 一级缓存和二级缓存原理区别 (图文详解)

    Java面试经常问到Mybatis一级缓存和二级缓存,今天就给大家重点详解Mybatis一级缓存和二级缓存原理与区别@mikechen Mybatis缓存 缓存就是内存中的数据,常常来自对数据库查询结 ...

随机推荐

  1. 服务器运行环境部署(PHP)

    1.使用的是腾讯云服务器,系统为centOS: 2.LAMP环境配置查看:https://cloud.tencent.com/document/product/213/8043: 3.mysql-se ...

  2. 字符串常用-----atof()函数,atoi()函数

    头文件:#include <stdlib.h>函数 atof() 用于将字符串转换为双精度浮点数(double),其原型为:double atof (const char* str);at ...

  3. 安徽省2016“京胜杯”程序设计大赛_G_木条染色

    木条染色 Time Limit: 1000 MS Memory Limit: 65536 KB Total Submissions: 134 Accepted: 20 Description    小 ...

  4. D重叠面积

    Description zjahstu是个很厚道的ACMer,O(∩_∩)O~..特为大家准备水题一道.. 题目很简单,两个矩形,告诉你矩形1,矩形2的面积和他们的总面积,请你求两矩形重叠部分的面积. ...

  5. vue的一些坑(第一天)

    1:刚开始在创建项目的时候一直出现vue不是内部或外部命令 关于这个的解决方案网上给出的很多的解决方案是配置环境,这个我就不在赘述了: 但是我觉得那样太麻烦,就没用,只是重新 npm i vue-cl ...

  6. CentOS6 安装Sendmail + Dovecot + Squirrelmail

    本文记录在本地虚拟机CentOS6上搭建Sendmail + Dovecot + Squirrelmail 的Webmail环境的过程,仅仅是本地局域网的环境测试,不配置DNS, 也没有安全认证,Sq ...

  7. Linux操作系统-命令-top

    当我们在执行性能测试的时候,需要关注 业务性能指标(业务监控) 吞吐量(TPS) 响应时间 平均响应时间 50%用户响应时间 90%用户响应时间 标准差 # TPS标准差越小,说明波动越小,系统越稳定 ...

  8. vbs系统监控

    vbs CPU 内存 硬盘监控脚本 On Error Resume Next Dim dwTotalMem, dwAvailMem, totalvolumn, freespace Const szRo ...

  9. Spark Streaming 调优指南

    SparkStreaming是架构在SparkCore上的一个"应用",SparkStreaming主要由DStreamGraph.Job的生成.数据的接收和导入以及容错四大模块组 ...

  10. noip普及组2007 Hanoi双塔问题

    Hanoi双塔问题 描述 给定A,B,C三根足够长的细柱,在A柱上放有2n个中间有孔的圆盘,共有n个不同的尺寸,每个尺寸都有两个相同的圆盘,注意这两个圆盘是不加区分的.现要将这些圆盘移到C柱上,在移动 ...