zoukankan      html  css  js  c++  java
  • 数据库中char, varchar, nvarchar的差异

    1. char
         固定长度,最长n个字符。

    2. varchar
         最大长度为n的可变字符串。
    (n为某一整数,不同数据库,最大长度n不同)

    char和varchar区别:
         varchar必char节省空间,但在效率上比char稍微差一些。
         说varchar比char节省空间,是因为varchar是可变字符串,比如:用varchar(5)存储字符串“abc”,只占用3个字节的存储空间,而用char(5)存储,则占用5个字节(“abc  ”)。
         说varchar比char效率稍差,是因为,当修改varchar数据时,可能因为数据长度不同,导致数据迁移(即:多余I/O)。其中,oracle对此多余I/O描述的表达是:“行迁移”(Row Migration)。

    “行迁移”(Row Migration):
          “当一行的记录初始插入时是可以存储在一个block中的,由于更新操作导致行增加了,而block的自由空间已经完全满了,这个时候就产生了行迁移。在这种情况下,oracle将会把整行数据迁移到一个新的block中,oracle会保留被迁移的行的原始指针指向新的存放行数据的block,这就意味着被迁移行的ROW ID是不会改变的。"
         其中要解释一下:block是oracle中最小的数据组织与管理单位,是数据文件磁盘储存空间单位,也是数据库I/O最小单位(也就是说,读和写都是一个block打大小,所以如果block没满时,更新内容长度变更的varchar字段,和更新内容长度没变的varchar字段,I/O次数是一样,不存在额外消耗,只有在block满时,才会出现额外I/O,所以char和varchar性能之间的性能差异,是相当细微的,绝大多数情况下可以忽略不计,所以上文描述的“稍”差的含义)
         所以,我的开发经验是:“用varchar完全代替char吧,没什么好顾虑的”。

    3. nvarchar
         nvarchar的特性,需要和varchar对比。
         nvarchar和varchar的不同主要是在对于数据的存储方式上:
         1). varchar:按字节存储数据
              varchar(6),最多能存储6个字节的数据,比如:“哈哈哈”,“abcdef”......
    备注:一个中文字符在数据库里占多少个字节,要看unicode的编码方式,比如:utf8在mysql上占3个字节,sqlserver的Chinese_PRC_CI_AS占2个字节...
         2). nvarchar:按字符存储数据
              nvarchar(6),最多能存储6个字符/中文数据,比如:"哈哈哈哈哈哈",“abcdef”......
              nvarchar(m)最大存储的实际字节长度=n*m(n跟据编码方式而定),如果nvarchar存储的是英文字符,也是根据编码方式存储n的字节长度。也就是说,如果nvarchar存储英文字符,会浪费一半以上的存储空间....
              
    总结:
         1. char和varchar的性能差距是很小的,可以考虑忽略不计。
         2. 在大数据量应用中,使用char和nvarchar有可能导致大量的存储空间的浪费。
    参考文章:

    作者:hyddd
    出处:http://www.cnblogs.com/hyddd/
    本文版权归作者所有,欢迎转载,演绎或用于商业目的,但是必须说明本文出处(包含链接)。

  • 相关阅读:
    LeetCode 515. 在每个树行中找最大值(Find Largest Value in Each Tree Row)
    LeetCode 114. 二叉树展开为链表(Flatten Binary Tree to Linked List)
    LeetCode 199. 二叉树的右视图(Binary Tree Right Side View)
    LeetCode 1022. 从根到叶的二进制数之和(Sum of Root To Leaf Binary Numbers)
    LeetCode 897. 递增顺序查找树(Increasing Order Search Tree)
    LeetCode 617. 合并二叉树(Merge Two Binary Trees)
    LeetCode 206. 反转链表(Reverse Linked List) 16
    LeetCode 104. 二叉树的最大深度(Maximum Depth of Binary Tree)
    LeetCode 110. 平衡二叉树(Balanced Binary Tree) 15
    LeetCode 108. 将有序数组转换为二叉搜索树(Convert Sorted Array to Binary Search Tree) 14
  • 原文地址:https://www.cnblogs.com/hyddd/p/2380702.html
Copyright © 2011-2022 走看看