|
收获很大,在测试过程中,增加了一些新的case,在测试过程中,发现“替代字符”往往容易转换成“靠”,“?”,“?”,“驴”,对这些乱码的产生原因有些不解!
1,数据库字符集设为gb2312,客户端设为WE8ISO8859P1,然后插入数据,读取数据
SET NLS_LANG=AMERICAN_AMERICA.WE8ISO8859P1
sqlplus system/manager@gb2312
select * from nls_database_parameters where PARAMETER='NLS_CHARACTERSET';
PARAMETER VALUE
--------------------------------- ---------------------------------
NLS_CHARACTERSET ZHS16CGB231280
insert into charset_test(server_charset,os_charset,client_charset,cn_char) values('GB2312','GB2312','ISO8859','中文');
commit;
column dump format a40
select server_charset,os_charset,client_charset,cn_char,dump(cn_char) dump from charset_test where client_charset='ISO8859' and os_charset='GB2312';
SERVER_ OS_CHAR CLIENT_ CN_CHAR DUMP
------- ------- ------- ------- ------------------------------
GB2312 GB2312 ISO8859 靠 Typ=1 Len=4: 214,208,206,196
可以看到存储是完全正确的,但是在读取的时候,出现“靠”(在gb2312中编码为191,191),我猜测,在这种环境下“替代字符”的编码是BF,由于两个替代字符BFBF,导致出现了一个“靠”
疑问:在Oracle中,各种环境下的替代字符是不是都是"?"?按照测试结果好像不是。另外,为什么显示结果“靠”(191,191)
在ISO8859 字符环境下,“替代字符”也应该是"?",在gb2312中,倒是有可能是中文“?”其编码是:163,191,但是无论如何,都不应该是”靠“
在服务器端字符集为iso8859,客户端字符集为:gb2312的环境下进行读取,存储测试!
SET NLS_LANG=AMERICAN_AMERICA.ZHS16CGB231280
sqlplus system/manager@iso8859
select * from nls_database_parameters where PARAMETER='NLS_CHARACTERSET';
PARAMETER VALUE
--------------------------------- ---------------------------------
NLS_CHARACTERSET WE8ISO8859P1
insert into charset_test(server_charset,os_charset,client_charset,cn_char) values('ISO8859','GB2312','GB2312','中文');
commit;
column dump format a40
select server_charset,os_charset,client_charset,cn_char,dump(cn_char) dump from charset_test where client_charset='GB2312' and os_charset='GB2312';
SERVER_CHARSET OS_CHARSET CLIENT_CHARSET CN_CHAR
-------------- -------------- -------------- --------------
DUMP
------------------------------
ISO8859 GB2312 GB2312 ??
Typ=1 Len=2: 191,191
疑问:为什么存储了191?难道191真的是某种字符集的“替代字符”?191但是显示结果为什么是“?”?
SET NLS_LANG=AMERICAN_AMERICA.UTF8
sqlplus system/manager@iso8859
insert into charset_test(server_charset,os_charset,client_charset,cn_char) values('ISO8859','GB2312','UTF8','中文');
commit;
column dump format a40
select server_charset,os_charset,client_charset,cn_char,dump(cn_char) dump from charset_test where client_charset='UTF8' and os_charset='GB2312';
SERVER_CHARSET OS_CHARSET CLIENT_CHARSET
--------------------- --------------------- ---------------------
CN_CHAR DUMP
--------------------- ------------------------------
ISO8859 GB2312 UTF8
驴驴 Typ=1 Len=2: 191,191
疑问:为什么191在UTF8下表示成为“驴”? |
|