1、如何查看Oracle中的编码格式
1.1 查看方式
-- 查看oracle字符集
-- NLS_NCHAR_CHARACTERSET,国家字符集,nchar、nvarchar2、nclob等类型数据的存储编码格式
-- NLS_CHARACTERSET,字符集,char、varchar2、clob、long等类型数据的存储编码格式
select t.* from nls_database_parameters t where t.parameter like '%CHARACTERSET%';
查询结果如下:
PARAMETER | VALUE |
---|---|
NLS_NCHAR_CHARACTERSET | AL16UTF16 |
NLS_CHARACTERSET | AL32UTF8 |
1.2 varchar2和nvarchar2的区别
1.2.1 默认长度单位
VARCHAR2(size type)
,size最大为4000,type可以是char也可以是byte,不标明type时默认是byte(如:name VARCHAR2(60))。
NVARCHAR2(size)
,size最大值为2000,单位是字符。
1.2.2 最大存储范围
VARCHAR2最多存放4000字节的数据,最多可以可以存入4000个字母,或最多存入2000个汉字(数据库字符集编码是GBK时,varchar2最多能存放2000个汉字,数据库字符集编码是UTF-8时,那就最多只能存放1333个汉字)
NVARCHAR2(size),size最大值为2000,单位是字符,而且不管是汉字还是字母,每个字符的长度都是2个字节。所以nvarchar2类型的数据最多能存放2000个汉字,也最多只能存放2000个字母。并且NVARCHAR2不受数据库字符集的影响。
2、Oracle编码格式测试
2.1 测试汉字
汉字 | GB2312编码 | BIG5编码 | GBK编码 | GB18030编码 | Unicode编码 | UTF-8编码 | UTF-16BE编码 | UTF-16LE编码 |
---|---|---|---|---|---|---|---|---|
啊 | B0A1 | B0DA | B0A1 | B0A1 | 0000554A | E5958A | 554A | 4A55 |
鵝 | 没有 | C35A | F95A | F95A | 00009D5D | E9B59D | 9D5D | 5D9D |
〇 | 没有 | 没有 | A996 | A996 | 00003007 | E38087 | 3007 | 0730 |
𬌗 | 没有 | 没有 | 没有 | 9931D239 | 0002C317 | F0AC8C97 | D870DF17 | 70D817DF |
我 | CED2 | A7DA | CED2 | CED2 | 00006211 | E68891 | 6211 | 1162 |
覺 | 没有 | C4B1 | D358 | D358 | 000089BA | E8A6BA | 89BA | BA89 |
喆 | 没有 | 没有 | 86B4 | 86B4 | 00005586 | E59686 | 5586 | 8655 |
鿏 | 没有 | 没有 | 没有 | 82359334 | 00009FCF | E9BF8F | 9FCF | CF9F |
2.2 环境准备
新建一个表test,其中包含一个varchar2字段和一个nvarchar2字段。然后,插入两条记录:
drop table test;
create table test(
colvarchar2 varchar2(1 char),
colnvarchar2 nvarchar2(1)
);
insert into test (colvarchar2, colnvarchar2) values('我', '我');
insert into test (colvarchar2, colnvarchar2) values('鿏', '鿏');
commit;
2.3 观察前面表中数据在Oracle中的存储
select
t.colvarchar2,
t.colnvarchar2,
length(t.colvarchar2) varchar2字符长度,
length(t.colnvarchar2) nvarchar2字符长度,
lengthb(t.colvarchar2) varchar2字节长度,
lengthb(t.colnvarchar2) nvarchar2字节长度,
UTL_RAW.CAST_TO_RAW(t.colvarchar2) varchar2存储编码,
UTL_RAW.CAST_TO_RAW(t.colnvarchar2) nvarchar2存储编码
from test t;
查询结果如下:
COLVARCHAR2 | COLNVARCHAR2 | VARCHAR2字符长度 | NVARCHAR2字符长度 | VARCHAR2字节长度 | NVARCHAR2字节长度 | VARCHAR2存储编码 | NVARCHAR2存储编码 |
---|---|---|---|---|---|---|---|
我 | 我 | 1 | 1 | 3 | 2 | E68891 | 6211 |
鿏 | 鿏 | 1 | 1 | 3 | 2 | E9BF8F | 9FCF |
对照前面字符的编码,可以很清晰的看出,nvarchar2和varchar的编码存储确实不一样。