Oracle字符集 ZHS16GBK VS WE8ISO8859P1

husthxd發表於2016-05-31
-- 測試指令碼如下:
-- 字符集WE8ISO8859P1,國家字符集AL16UTF16
-- nchar型別
set NLS_LANG=AMERICAN_AMERICA.WE8ISO8859P1
drop table utf16_1;
create table utf16_1 (nc1 nchar(1),nc2 nchar(2),nc3 nchar(3) );
insert into utf16_1 values('a','測','從1');

dump結果:
select dump(nc1),dump(nc2),dump(nc3) from utf16_1;

Typ=96 Len=2: 0,97
Typ=96 Len=4: 0,178,0,226
Typ=96 Len=6: 0,180,0,211,0,49

-- char型別
drop table utf16_2;
create table utf16_2 (c1 char(1),c2 char(2),c3 char(3) );
insert into utf16_2 values('a','測','從1');

dump結果:

select dump(c1),dump(c2),dump(c3) from utf16_2;

Typ=96 Len=1: 97
Typ=96 Len=2: 178,226
Typ=96 Len=3: 180,211,49

結論:ISO8859P1這類單位元組字符集,nchar和char的區別是nchar雙位元組儲存,char單位元組儲存,字元編碼一樣。

-- 字符集ZHS16GBK,國家字符集AL16UTF16
set NLS_LANG=AMERICAN_AMERICA.ZHS16GBK
-- nchar型別
drop table utf16_1;
create table utf16_1 (nc1 nchar(1),nc2 nchar(2),nc3 nchar(3) );
insert into utf16_1 values('a','測','從1');

dump結果:

select dump(nc1),dump(nc2),dump(nc3) from utf16_1;

Typ=96 Len=2: 0,97
Typ=96 Len=4: 109,75,0,32
Typ=96 Len=6: 78,206,0,49,0,32

-- char型別
drop table utf16_2;
create table utf16_2 (c1 char(1),c2 char(2),c3 char(3) );
insert into utf16_2 values('a','測','從1');

dump結果:
select dump(c1),dump(c2),dump(c3) from utf16_2;

Typ=96 Len=1: 97
Typ=96 Len=2: 178,226
Typ=96 Len=3: 180,211,49

結論:GBK字符集,nchar和char的區別是nchar雙位元組儲存,char單位元組儲存,字元編碼不一樣。

Oracle的國家字符集跟字符集還有關係,這個跟先前理解的不太一樣,按個人理解,不管字符集是什麼,國家字符集字元編碼應該是一樣的才對。


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/6906/viewspace-2109891/,如需轉載,請註明出處,否則將追究法律責任。

相關文章