一直对varchar2、nvarchar2 字段类型存储字符数不清楚,现测试如下:
创建TT测试表
测试脚本如下:
insert into tt values('1111','1111'); -----ok
insert into tt values('wwww','wwww')-----ok
insert into tt values('应用范围','应用范围');-----失败
提示如下:
insert into tt values('应用范围','应用');-----失败
提示如下:
insert into tt values('应用范围','应w')----ok
附1:
数据库字符集:
附2:
VARCHAR2是Oracle提供的特定数据类型,Oracle可以保证VARCHAR2在任何版本中该数据类型都可以向上和向下兼容。
VARCHAR在Oracle中不建议使用。
具体到 NVARCHAR2和VARCHAR2的区别,从使用角度来看区别在于:
NVARCHAR2在计算长度时和字符集相关的,例如数据库是中文字符集时以长度10为例,则
1、NVARCHAR2(10)是可以存进去10个汉字的,如果用来存英文也只能存10个字符。
2、而VARCHAR2(10)的话,则只能存进5个汉字( 注:要根据字符集:GBK:2;UTF-8:3 ),英文则可以存10个。
原文; http://www.cnblogs.com/flyingfish/archive/2010/01/15/1648448.html
附3:
现在版本的Oracle,varchar和varchar2是没有区别的,varchar2和ANSI varchar的区别是varchar2把空串等同于null处理。
这也是为什么ORACLE推荐使用varchar2类型的原因,因为如果新版本Oralce的varchar类型完全兼容ANSI标准时,使用varchar2的脚本可以不修改。
至于一个varchar2字符要用几个字节存储,要看数据库使用的字符集,
比如GBK,汉字就会占两个字节,英文1个,
如果是UTF-8,汉字一般占3个字节,英文还是1个。
而NCHAR、NVARCHAR是以UNICODE-16存储,每个字符固定两个字节。
原文: http://www.blogjava.net/xcp/archive/2009/10/06/oracle1.html
附4:
char类型: 对英文(ASCII)字符占用1个字节,对一个汉字占用2个字节,CHAR存储定长数据很方便,CHAR字段上的索引效率级高,比如定义 char(10),那么不论你存储的数据是否达到了10个字节,都要占去10个字节的空间。因为是固定长度,所以速度效率高。
varchar类型:Varchar 的类型不以空格填满,比如varchar(100),但它的值只是"qian",则它的值就是"qian"
而char 不一样,比如char(100),它的值是"qian",而实际上它在数据库中是"qian "(qian后共有96个空格,就是把它填满为100个字节)。
由于char是以固定长度的,所以它的速度会比varchar快得多!但程序处理起来要麻烦一点,要用trim之类的函数把两边的空格去掉!
varchar 存储变长数据,但存储效率没有CHAR高。如 果一个字段可能的值是不固定长度的,我们只知道它不可能超过10个字符,把它定义为 varchar(10)是最合算的。varchar类型的实际长度是它的值的实际长度+1。为什么“+1”呢?这一个字节用于保存实际使用了多大的长度。
nchar类型和Nvarchar类型是怎么一回事呢?为了与其他多种字符的转换,如中文,音标等,对每个英文(ASCII)字符都占用2个字节,对一个 汉字也占用两个字节,所有的字符都占用2个字节。
举个例子:
insert a select '木子a'
----存储长度为5个字节,余下的3个字节全部释放
insert a select '木神易
----存储长度为6个字节,余下的2个字节全部释放
----意思是varchar变长字符数据类型与存储数据的实际长度是一致的
nvarchar(n):可变长度 Unicode 数据,其最大长度为 4,000 字符。
字节的存储大小是所输入字符个数的两倍,
就是说它是双字节来存储数据的。
如果存储数据如果存在单字节时,它也是以双字节来占用存储空间的。
varchar一般适用于英文和数字,nvarchar适用中文和其他字符,其中 N表示Unicode常量,可以解决多语言字符集之间的转换问题
原文出处: http://www.cnblogs.com/moss_tan_jun/archive/2010/01/30/1659741.html
附5:
“char比varchar快得多”的说法并不正确。同样“VARCHAR存储变长数据,但存储效率没有CHAR高。”的说法也不正确。
在某些情况下,char比varchar会快一些;某些情况varchar比char快(这种情况可能更多)。事实上,char比varchar快得多的情况几乎没有(除非是极端情况,如错误地使用varchar(1))。
初看起来,由于char是固定长度,它在数据行(row)中的位置(或偏移量)是固定的。因此char字段的获取几乎是直接跳到该位置然后开始读取。而varchar由于长度不固定,varchar字段的获取还需要通过一个间接跳转(类似于lookup table)。但实际上,由于该操作是在内存中进行,除了多几条CPU指令之外,几乎谈不上什么开销。
而通常一个数据页存储的记录数多少更能影响数据库的性能,因为它牵涉到磁盘I/O。假设字段长度为100,而平均字符串数据长度只有50,那么varchar(100)要比char(100)更快。极端情况,如果该表的字段很少,那么varchar会比char快很多。因为同样大小的磁盘读取,采用varchar读取的记录数会接近char的两倍。
对于更新(update)操作的性能,则要取决于填充率(fill factor)和更新的频度。
对于varchar和char的选择,一般性的指导原则是,对于最大长度<=4的字符串,使用char(nchar); 对于最大长度大于20的字符串,使用varchar(nvarchar)。对于4~20之间的字符串,可以根据自己情况定。对于大多数情形,使用varchar会更好。
msolap