详见: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. ES6 变量、常量声明总结

    较之前ES5,新颁布在声明上有改变 一.var  对比  let 1.作用域不同 let只在命令所在的代码块 {} 里有效 ES5只有全局作用域和函数作用域,没有块级作用域,带来很多不合理的场景,比如 ...

  2. RabbitMQ 使用场景一

    安装环境 1.下载安装 Erlang 运行时环境 2.下载安装 RabbitMQ Server 应用程序 3.启动 RabbitMQ 服务(默认启动) 4.安装管理平台插件并打开远程访问权限 4.1. ...

  3. Python使用openpyxl读写excel文件

    Python使用openpyxl读写excel文件 这是一个第三方库,可以处理xlsx格式的Excel文件.pip install openpyxl安装.如果使用Aanconda,应该自带了. 读取E ...

  4. 9. leetcode 389. Find the Difference

    Given two strings s and t which consist of only lowercase letters. String t is generated by random s ...

  5. js prototype 继承

    //继承 function inherits(ctor,superCtor){ ctor.super_ = superCtor; ctor.prototype = Object.create(supe ...

  6. git分支管理之解决冲突

    人生不如意之事十之八九,合并分支往往也不是一帆风顺的. 准备新的feature1分支,继续我们的新分支开发: $ git checkout -b feature1 Switched to a new ...

  7. 由.Net类库提供的农历计算

             由.Net类库提供的农历计算(C#农历)                 2007-11-21 12:47:00 标签:.Net 类库 农历计算 C#农历 休闲            ...

  8. h5 录音

    得益于前辈的分享,做了一个h5录音的demo.效果图如下: 点击开始录音会先弹出确认框: 首次确认允许后,再次录音不需要再确认,但如果用户点击禁止,则无法录音: 点击发送 将录音内容发送到对话框中.点 ...

  9. 资金平台交易明细扩展开发-DEP

    前言 支持农垦项目中,需要增加抓取银行接口传输数据,需求有两点:一是银企平台前置机需要增加扩展中行.农行数据字段.(代理账号.代理账户名称.代理银行) 二是EAS资金模块中的交易明细查询列表界面能够显 ...

  10. Oracle维护:每天的工作

    Oracle维护:每天的工作 检查数据库状态 确认所有的INSTANCE状态以及listener状态正常,登陆到所有数据库或例程,检测ORACLE后台进程: $ ps –ef|grep ora $ l ...