1.char与varchar的比较

  (1)数据存储开销

    【1】varchar列需要2个额外的字节来记录存储数据的长度

    【2】每个可为null的char列,需要一些字节(空位图)来反应数据的为空性

    【3】无论数据多少,char都占定义的长度分配的存储空间

    【4】varchar是存储多少空间,就占多少空间,最大不能超过定义的空间,除此之外还需要2个额外的字节如【1】中所属。

    【5】索引上的数据存储不需要额外的内部开销,索引数据的存储方式与数据也在数据的存储方式一样。

  (2)NULL值

    【1】char列的null占用存储空间

    【2】varchar列的null不占存储空间

    【3】插入同样数量的null,varchar比char效率高出很多

  (3)插入数据

    【1】无论是否有索引,char的效率都低于varchar的效率

  (4)更新数据

    【1】如果更新的列未建立索引,则char的效率低于varchar,但区别不大

    【2】如果更新的列简历的索引,则char的效率低于varchar,且区别较大

  (5)修改结构

    【1】无论是增加还是删除,char与varchar的效率没有什么差异

    【2】对于增加列的宽段而言,varchar基本上不花多少时间(因为本来就给它预留了那么多空间并且是根据实际存储数据来分配空间),char则需要花费很长时间(要考虑页分裂、或存储到ROW_OVERFLOW_DATA

  (6)数据检索

    【1】无论是否有索引,varchar都比char的扫描要略优。(因为扫描的长度与页数)

2.如何选择char与varchar

  (1)char使用情况

    【1】列汇总的各行数据长度基本一致,长度变化小,不超过50字节

    【2】数据变更频繁,检索需求少

    【3】列长度不会经常变化,因为修改char类型的列宽代价很大

    【4】不要出现大量null,因为char中null占存储空间

    【5】列上不需要建过多索引,过多的索引对char列的数据变更影响较大

  (2)varchar使用情况

    【1】列中各行长度差异较大

    【2】列中数据更新非常少(因为虽然是存多少占多少空间,但是为了避免增长导致使用row_overflow_data),但查询非常频繁

    【3】列中没有数据,或为null、空值

3.其他影响因素

  (1)列是否允许NULL值

    如果允许,则需要考虑NULL值所占数据的比例,定义char null的列时,需要额外的开销来反应为NULL的情况,这回导致插入NULL值分配更多的空间,影响性能,当大表且NULL量较大时,性能影响非常明显。

  (2)磁盘空间开销

    使用char存储数据时,它占用的空间长度为列定义的长度,与实际数据长度无关,因此往往意味着会比varchar消耗更多存储空间

  (3)内存大小

    SQL SERVER 以页为单位,数据占用的页越多,往往以为着内存消耗更高,如果数据还没有加载到内存中则读取更多的数据页也意味着更多的磁盘I/O。

  (4)数据传输

    数据传输主要考虑服务器到客户端,或者是服务器之间的数据交互,或者是与其他系统的数据交互。

(3.4)常用知识-char与varchar的选择的更多相关文章

  1. char、varchar和nvarchar的区别

    首先char.varchar和nvarchar.text.ntext都是数据库中的文本数据类型,再区分区分var前缀.n前缀的区别.而text.ntext已经普遍被varchar(MAX)和nvarc ...

  2. MySQL的char和varchar

    一.VARCHAR与CHAR字符型数据的差异 在MySQL数据库中,用的最多的字符型数据类型就是Varchar和Char,这两种数据类型虽然都是用来存放字符型数据,但是无论从结构还是从数据的保存方式来 ...

  3. 2019-2-20Sqlserver数据库中char、varchar、nchar、nvarchar的区别及查询表结构

    varchar 和 nvarchar区别: varchar(n)长度为 n 个字节的可变长度且非 Unicode 的字符数据.n 必须是一个介于 1 和 8,000 之间的数值.存储大小为输入数据的字 ...

  4. MySQL数据库char与varchar的区别分析及使用建议

    在数据库中,字符 型的数据是最多的,可以占到整个数据库的80%以上.为此正确处理字符型的数据,对于提高数据库的性能有很大的作用.在字符型数据中,用的最多的就是 Char与Varchar两种类型.前面的 ...

  5. char 与 varchar 区别

    MySQL中的字符串有两个常用的类型:char和varchar,二者各有优势,下面我们来详细分析一下.  转载加补充 在建立数据库表结构的时候,为了给一个String类型的数据定义一个数据库的数据库类 ...

  6. (3.10)常用知识-T-SQL优化

    关键字:SQL优化 总结: 1.书写问题 2.表连接方式 3.索引的抉择 4.执行计划之参数嗅探,使用提示强制执行计划 5.子查询与表连接的效率 6.临时表.CTE.表变量的选择 7.常用sp与sel ...

  7. SQL中char、varchar、nchar、nvarchar 详解

    char     char是定长的,也就是当你输入的字符小于你指定的数目时,char(8),你输入的字符小于8时,它会再后面补空值.当你输入的字符大于指定的数时,它会截取超出的字符. varchar[ ...

  8. Sql Server char、varchar、nchar、nvarchar的区别

    (1) 定义: char: 固定长度,存储ANSI字符,不足的补英文半角空格. nchar: 固定长度,存储Unicode字符,不足的补英文半角空格 varchar: 可变长度,存储ANSI字符,根据 ...

  9. 浅谈SQL Server、MySQL中char,varchar,nchar,nvarchar区别

    最近一次的面试中,被面试官问到varchar和nvarchar的区别,脑海里记得是定长和可变长度的区别,但却没能说出来.后来,在网上找了下网友总结的区别.在这里做个备忘录: 一,SQL Server中 ...

随机推荐

  1. Linux系统中的硬件问题如何排查?(5)

    Linux系统中的硬件问题如何排查?(5) 2013-03-27 10:32 核子可乐译 51CTO.com 字号:T | T 在Linux系统中,对于硬件故障问题的排查可能是计算机管理领域最棘手的工 ...

  2. 常见状态码StatusCode

    当浏览者访问一个网页时,浏览者的浏览器会向网页所在服务器发出请求.当浏览器接收并显示网页前,此网页所在的服务器会返回一个包含HTTP状态码的信息头(server header)用以响应浏览器的请求. ...

  3. java——AtomicInteger 中 incrementAndGet与getAndIncrement 两个方法的区别

    https://blog.csdn.net/chenkaibsw/article/details/81031950 源码: getAndIncrement: public final int getA ...

  4. keras学习笔记-bili莫烦

    一.keras的backend设置 有两种方式: 1.修改JSON配置文件 修改~/.keras/keras.json文件内容为: { "iamge_dim_ordering":& ...

  5. XML 浏览器支持

    几乎所有的主流浏览器均支持 XML 和 XSLT. Mozilla Firefox 从 1.0.2 版本开始,Firefox 就已开始支持 XML 和 XSLT(包括 CSS). Mozilla Mo ...

  6. BZOJ 2121: 字符串游戏 区间DP + 思维

    Description BX正在进行一个字符串游戏,他手上有一个字符串L,以及其他一些字符串的集合S,然后他可以进行以下操作:对 于一个在集合S中的字符串p,如果p在L中出现,BX就可以选择是否将其删 ...

  7. [算法]概率与期望DP

    前言 前两节主要针对题目分析,没时间的珂以跳过. 初步 首先举一道简单.经典的好题: [Lightoj1038]Race to 1 Again 懒得单独写,安利一下DennyQi同学的博客:https ...

  8. Oracle-分配用户只读存储过程权限

    系统新来了系统运维人员,要求创建数据库账号,只分配对表,视图,存储程序有只读权限 因为表和视图权限接触比较频繁,所以今天花点时间整理下关于存储过程的权限 关于ORACLE账号的权限问题,一般分为两种权 ...

  9. C++学习一二

    为了更深入的学习程序编写,以及进行相关算法的编写.决定每天花点时间学习C++:以下是每天的学习笔记. 一.std代表命名空间,可以用using来省略. 二.std:endl.输出一个换行符,并且“刷新 ...

  10. Run nginx from Docker in Windows

    1.首先, 使用 docker run hello-world 命令 确认 docker 在本地安装成功,若成功应如下所示(此处使用的是 Docker Toolbox 在Windows上安装Docke ...