关于Oracle中varchar2和nvarchar2的区别及使用? 5
1.数据库码制为U8,nchar码制为U16SQL>select*fromnls_database_parameterswhereparameterin('NLS_NCH...
1. 数据库码制为U8,nchar码制为U16
SQL> select * from nls_database_parameters where parameter in('NLS_NCHAR_CHARACTERSET','NLS_CHARACTERSET');
PARAMETER VALUE
------------------------------ ----------------------------------------------------------------------------------------------------------------------------------------------------------------
NLS_CHARACTERSET AL32UTF8
NLS_NCHAR_CHARACTERSET AL16UTF16
2. 创建测试表并插入数据:
SQL> create table zwtest(col1 varchar2(50),col2 nvarchar2(50));
Table created.
SQL> insert into zwtest values('你好','你好');
1 row created.
SQL> commit;
Commit complete.
3. 查询两种类型所占长度:
SQL> select lengthb(col1),lengthc(col1),lengthb(col2),lengthc(col2) from zwtest;
LENGTHB(COL1) LENGTHC(COL1) LENGTHB(COL2) LENGTHC(COL2)
------------- ------------- ------------- -------------
18 6 12 6
我彻底凌乱了。。。。
疑问:varchar2的长度不是限定的最大字节数嘛,而U8编码一个汉字为三到四个字节,为什么步骤三中查询出来两个汉字竟然占了18个字节?!!而nvarchar2字节数为12? 两种类型的字符数均为6?
两种类型到底怎么一个区别?使用场景分别是什么?求大仙解答!
上述测试的客户端码制为U8:
[oracle@odd ~]$ env|grep LANG
LANG=en_US.UTF-8
另外在客户端为GBK,db为GBK、db 的nchar码制为UTF16 的数据库上使用上述数据也测试了下,结果如下:
SQL> select lengthb(col1),lengthc(col1),lengthb(col2),lengthc(col2) from zwtest;
LENGTHB(COL1) LENGTHC(COL1) LENGTHB(COL2) LENGTHC(COL2)
------------- ------------- ------------- -------------
4 4 8 4
对于这个结果,varchar2可以理解,但是两个汉字用nvarchar2为什么是4个字符?不解。。。 展开
SQL> select * from nls_database_parameters where parameter in('NLS_NCHAR_CHARACTERSET','NLS_CHARACTERSET');
PARAMETER VALUE
------------------------------ ----------------------------------------------------------------------------------------------------------------------------------------------------------------
NLS_CHARACTERSET AL32UTF8
NLS_NCHAR_CHARACTERSET AL16UTF16
2. 创建测试表并插入数据:
SQL> create table zwtest(col1 varchar2(50),col2 nvarchar2(50));
Table created.
SQL> insert into zwtest values('你好','你好');
1 row created.
SQL> commit;
Commit complete.
3. 查询两种类型所占长度:
SQL> select lengthb(col1),lengthc(col1),lengthb(col2),lengthc(col2) from zwtest;
LENGTHB(COL1) LENGTHC(COL1) LENGTHB(COL2) LENGTHC(COL2)
------------- ------------- ------------- -------------
18 6 12 6
我彻底凌乱了。。。。
疑问:varchar2的长度不是限定的最大字节数嘛,而U8编码一个汉字为三到四个字节,为什么步骤三中查询出来两个汉字竟然占了18个字节?!!而nvarchar2字节数为12? 两种类型的字符数均为6?
两种类型到底怎么一个区别?使用场景分别是什么?求大仙解答!
上述测试的客户端码制为U8:
[oracle@odd ~]$ env|grep LANG
LANG=en_US.UTF-8
另外在客户端为GBK,db为GBK、db 的nchar码制为UTF16 的数据库上使用上述数据也测试了下,结果如下:
SQL> select lengthb(col1),lengthc(col1),lengthb(col2),lengthc(col2) from zwtest;
LENGTHB(COL1) LENGTHC(COL1) LENGTHB(COL2) LENGTHC(COL2)
------------- ------------- ------------- -------------
4 4 8 4
对于这个结果,varchar2可以理解,但是两个汉字用nvarchar2为什么是4个字符?不解。。。 展开
2个回答
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询