本帖最后由 chenyu 于 2010-12-7 16:24 编辑
LINUX下访问WINDOWS数据库的测试
WINDOWS服务器端数据库字符集配置
SQL> select * from nls_database_parameters;
PARAMETER VALUE
------------------------------ --------------------------------------------------
NLS_LANGUAGE AMERICAN
NLS_NCHAR_CHARACTERSET AL16UTF16
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
NLS_SORT BINARY
NLS_TIME_FORMAT HH.MI.SSXFF AM
NLS_TIMESTAMP_FORMAT DD-MON-RR HH.MI.SSXFF AM
NLS_TIME_TZ_FORMAT HH.MI.SSXFF AM TZR
NLS_TIMESTAMP_TZ_FORMAT DD-MON-RR HH.MI.SSXFF AM TZR
NLS_DUAL_CURRENCY $
NLS_COMP BINARY
NLS_LENGTH_SEMANTICS BYTE
NLS_NCHAR_CONV_EXCP FALSE
NLS_RDBMS_VERSION 10.2.0.4.0
当前WINDOWS中的服务器中已经有一条数据了,是在WINDOWS的客户端输入的,使用windows客户端使用sqlplus查看
SQL> select name,dump(name) from a;
NAME DUMP(NAME)
-------------------- -----------------------------------------------------------
中国 Typ=1 Len=4: 214,208,185,250
LINUX下用sqlplus客户端查看
export NLS_LANG=AMERICAN_AMERICA.AL32UTF8
把客户端的字符集环境变量设置成和操作系统的字符集一致,这里不能设置为"SIMPLIFIED CHINESE"_CHINA.ZHS16GBK,因为如果这么设置就不会发生字符集转换,但是客户端的操作系统是AL32UTF8(或者是和AL32UTF8兼容的字符集),服务器端直接把ZHS16GBK的编码发过来在AL32UTF8下显示肯定是乱码,我们要保证服务器端发过来的也是AL32UTF8编码,所以我们这里设置为AMERICAN_AMERICA.AL32UTF8,这样ORACLE就会在服务器端把数据由ZHS16GBK转换成AL32UTF8并发送到客户端,而客户端的操作系统也是AL32UTF8(或者是和AL32UTF8兼容的字符集)所以中文就能够正常显示了。
SQL> select * from a;
NAME
------------------------------------------------------------
中国
--在linux客户端插入中文
SQL> insert into a values('用户');
1 row created.
SQL> commit;
Commit complete.
SQL> select * from a;
NAME
------------------------------------------------------------
用户
中国
然后在使用WINDOWS的客户端来显示
SQL> select name,dump(name) from a;
NAME DUMP(NAME)
-------------------- -----------------------------------------------------------
用户 Typ=1 Len=4: 211,195,187,167
中国 Typ=1 Len=4: 214,208,185,250 |