本文主要比较一下char、varchar2、nchar、nvarchar2的区别。
1.字符集不同
数据库在创建的时候会指定两个字符集,Character set 和 NCHAR Character set;char、varchar2用Character set存储;
nchar、nvarchar2用NCHAR Character set存储
- select * from database_properties where property_name like '%CHARACTERSET%';
2.定义长度&实际存储长度
char:定长字符,字符的长度如果达不到定义的长度,则补空格填满定义长度,即 字符补空格后长度=定义长度
varchar2:变长字符,字符长度可能没有定义的长,即 字符长度<=定义长度
- create table t_char_test1
(
c1 char(10),
c2 varchar2(10)
);
insert into t_char_test1(c1, c2) values('中文1', '中文1');
commit;
select dump(c1, 16), dump(c2, 16) from t_char_test1;
c1(char)的值占了7个byte,后面补了3个空格(20),一共10个byte;
c2(varchar2)的值占了7个byte;
nchar、nvarchar2占用空间大小的区别 与 char、nvarchar2一样,不再比较。
3.字节长度&字符长度
varchar2默认指定长度的单位为 byte,4个中文已经超过10个byte,所以插入报错;char类型也是一样。- create table t_char_test2
(
c1 varchar2(10)
);
insert into t_char_test2(c1) values('中文中文');
commit;
nvarchar2指定长度的单位为 字符,所以可以插入10个中文字符
- create table t_char_test3
(
c1 nvarchar2(10)
);
insert into t_char_test3(c1) values('中文');
insert into t_char_test3(c1) values('中文中文中文中文中文');
commit;
select dump(c1, 16) from t_char_test3;
不过nvarchar2还是会受最大4000 bytes的限制,即 字符 所占用的空间 最大不能超过4000个byte,而一个字符占几个byte是由NCharacter set决定的。
NCharacter set可以选择两种字符集,UTF8、AL16UTF16;
UTF8为变长字符集,在定制字段类型的时候可以指定最大长度为4000,但实际能存储最大字符数据可能不到4000,如果全存中文,最多存1333个字符,如果全存英文则可以存4000个字符;
AL16UTF16为定长字符集,任何一个字符都用2个byte存储,所以在定义字段长度的时候最大只能是2000。
4.以下是Oracle Database SQL Reference中的描述
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/7417681/viewspace-2124782/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/7417681/viewspace-2124782/