开发者社区> 长征2号> 正文
阿里云
为了无法计算的价值
打开APP
阿里云APP内打开

数据库中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/archive/2012/03/05/2380702.html,如需转载请自行联系原作者。

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
【MySQL字符串数据类型优化】char和varchar的这些细节你们都清楚吗?
【MySQL字符串数据类型优化】char和varchar的这些细节你们都清楚吗?
0 0
数据库中char、varchar、varchar2、nvarchar之间的关系
符串“abc",对于CHAR (20),表示你存储的字符将占20个字节(包括17个空字符),而同样的VARCHAR2 (20)则只占用3个字节的长度,20只是最大值,当你存储的字符小于20时,按实际长度存储。
1597 0
【MySQL】varbinary 真的比varchar 更合适?
一 前言     在讨论数据表字段设计的时候,有同学提出使用vabinary 代替 varchar ,部分开发不明所以,其实我也是。两者之间具体有什么区别?使用vabinary 代替 varchar 对业务有何优势?本文尝试从性能,数据大小,查询,创建索引等对比功能等方面进行研究,有不妥或者不到位之处还请各位读者朋友提示。
1753 0
MYSQL的CHAR和VARCHAR注意事项 以及binary和varbinary存储方式
版本使用5.7 存储引擎INNODB 行格式Dynamic 从概念上讲他们用于存放字符型数据,其允许的范围: 1、char 0-255 bytes,固定长度,不够的长度用ASCII 0X20进行补足。
807 0
数据库设计之数据库tinyint字段与Int字段的使用
SQL SERVER中的tinyint:从 0 到 255 的整型数据。存储大小为 1 字节。 SQL SERVER中的Smallint: 存储大小为 2 字节。
728 0
数据库中varchar和Nvarchar区别与联系
        在数据库中新建表的时候发现了字段类型有的带n有的不带n,那么两者之间有什么区别?        于是上网查找一些资料如下: 一、 1、CHAR。CHAR存储定长数据很方便,CHAR字段上的索引效率级高,比如定义char(10),那么不论你存储的数据是否达到了10个字节,都要占去10个字节的空间,不足的自动用空格填充,所以在读取的时候可能要多次用到trim()。 2、V
893 0
mysql中char与varchar的区别分析
char 固定长度,所以在处理速度上要比varchar快速很多,但是对费存储空间,所以对存储不大,但在速度上有要求的可以使用char类型,反之可以用varchar类型来实例   建意: myisam 存储引擎 建议使用固定长度,数据列代替可变长度的数据列。
632 0
认真对待数据库中char和varchar
       大家现在都在做或者做完了机房收费系统,其中创建数据库阶段,会涉及到数据类型的设置,大家都有所了解了,那么我们来讨论一下其中的Char和Varchar的区别吧。
565 0
SQL中char,varchar 和nchar,nvarchar的区别
Varchar 对每个英文(ASCII)字符都占用2个字节,对一个汉字也只占用两个字节char 对英文(ASCII)字符占用1个字节,对一个汉字占用2个字节Varchar 的类型不以空格填满,比如varchar(100),但它的值只是"qian",则它的值就是"qian"而char 不一样,比如char(100),它的值是"qian",而实际上它在数据库中是"qian "(qian后共有96个空格,就是把它填满为100个字节)。
597 0
+关注
文章
问答
文章排行榜
最热
最新
相关电子书
更多
低代码开发师(初级)实战教程
立即下载
阿里巴巴DevOps 最佳实践手册
立即下载
冬季实战营第三期:MySQL数据库进阶实战
立即下载