理解Oracle字符集,有三个字符集要搞清楚。Oracle服务器字符集、客户端字符集、客户端系统字符集。通常客户端字符集和客户端系统字符集要一致。
服务器字符集确定字符是以那种编码存储在数据库服务器中的。
客户端字符集用于
确定在客户端与服务器之间是否需要进行字符转换。
客户端系统字符集用于在客户端对字符进行编码和显示服务器传递的字符。
PARAMETER VALUE
------------------------------ ------------------------------
NLS_LANGUAGE AMERICAN
NLS_TERRITORY AMERICA
NLS_CURRENCY $
NLS_ISO_CURRENCY AMERICA
NLS_NUMERIC_CHARACTERS .,
NLS_CHARACTERSET
ZHS16GBK
NLS_CALENDAR GREGORIAN
NLS_DATE_FORMAT DD-MON-RR
NLS_DATE_LANGUAGE AMERICAN
可以看到服务器的字符集是
ZHS16GBK。
create table t (id number,name varchar(20));
- 客户端系统字符集、客户端字符集、服务器字符集三者相同
客户端1:
设置系统字符集LANG="zh_CN.
gbk"
设置客户端字符集NLS_LANG=AMERICAN_AMERICA.
ZHS16GBK
客户端2:
设置系统字符集LANG="zh_CN.
gbk"
设置客户端字符集NLS_LANG=AMERICAN_AMERICA.
ZHS16GBK
客户端1:
insert into t(1,'上海');
commit;
客户端2:
insert into t(2,'中国');
commit;
客户端1:
select * from t;
ID NAME
---------- --------------------
1 上海
2 中国
客户端2:
ID NAME
---------- --------------------
1 上海
2 中国
- 客户端字符集与服务器字符集相同,但与客户端系统字符集不同
删除表t中的数据:
delete from t;
commit;
客户端1:
设置系统字符集LANG="zh_CN.
utf8"
客户端1:
insert into t values(1,'上海');
commit;
客户端1:
select * from t;
ID NAME
---------- --------------------
1 上海
客户端2:
select * from t;
ID NAME
---------- --------------------
1
涓婃捣
出现乱码!!!!
如果客户端字符集和服务器字符集相同,则不进行字符编码转换。如果客户端操作系统字符集是utf8,客户端字符集是zhs16gbk,服务器字符集是zhs16gbk,服务器会认为传递过来的是zhs16gbk编码,并按源编码存储。客户端查询数据时,服务器与客户端之间也不会进行编码转换,客户端系统会按utf8字符集解释编码。这样阴差阳错的客户端显示正确的字符集,因为字符没有转换。但是当客户端2查询时,由于客户端字符集和服务器字符集相同,不会进行字符转换,客户端2用zhs16gbk字符集解析utf8的编码,这样就会产生乱码。
**********************************华丽的分割线****************************************************
客户端2:
insert into t values(2,'中国');
commit;
客户端1:
select * from t;
ID NAME
---------- --------------------
2
�й
1 上海
客户端2:
select * from t;
ID NAME
---------- --------------------
2 中国
1 涓婃捣
出现乱码!!!!!!!!!这是因为字符‘中国’是按zhs16gbk编码存储,没有经过转换就按utf8解析显示,所以出现乱码!
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/25791987/viewspace-721601/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/25791987/viewspace-721601/