char,varchar,nvarchar区别
2015-08-13 19:37
351 查看
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有可能导致大量的存储空间的浪费。
固定长度,最长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有可能导致大量的存储空间的浪费。
相关文章推荐
- A.1.17
- Spring的事务管理
- 推荐系统——冷启动问题
- HDOJ-1863-畅通工程
- 引跑科技助力传统企业构建大数据价值体系
- linux下运行c或c++
- OC 将汉语数字转换成阿拉伯数字
- HDU 5387 Clock
- php根据经纬度计算距离和方向
- Construct Binary Tree from Inorder and Preorder(Inorder and Postorder) Traversal
- C++中this指针的本质
- MyEclipse反编译Class文件
- 深入JavaScript(8)S.O.L.I.D五大原则之里氏替换原则LSP
- 用OC语言完成简易通讯录(实现增删改查)功能.
- UVA 297 Tree
- 深入JavaScript(7)S.O.L.I.D五大原则之开闭原则OCP
- hdu 3117 Fibonacci Numbers(数学推导+矩阵连乘)
- android-ndk开发helloworld
- 关键字volatile
- 关于开发人员申请苹果账号相关事宜