WebSphere+Oracle乱码问题解决

juncke 2013-11-26

环境介绍:

        Web容器(中间件):WebSphere7.0。

        Web容器所在操作系统:windows2003 sp2。

        数据库:oracle 10.2.0.1.0。

        数据库所在操作系统:Red Hat Linux5.5

一般的应用程序在保存数据时,存到数据库当中出现乱码,可能跟如下两个部位有关(一般两个部位都需要调整)。

一是数据库方面:

将WE8ISO8859P1修改为ZHS16GBK。

首先要通过SSH或其他工具连接到Oracle所在操作系统(Server端)。

登录成功后,依次执行如下命令:

SQL> conn /as sysdba 

Connected. 

SQL> shutdown immediate; 

Database closed. 

Database dismounted. 

ORACLE instance shut down. 

SQL> startup mount 

ORACLE instance started. 

Total System Global Area  236000356 bytes 

Fixed Size                   451684 bytes 

Variable Size             201326592 bytes 

Database Buffers           33554432 bytes 

Redo Buffers                 667648 bytes 

Database mounted. 

SQL> ALTER SYSTEM ENABLE RESTRICTED SESSION; 

System altered. 

SQL> ALTER SYSTEM SET JOB_QUEUE_PROCESSES=0; 

System altered. 

SQL> ALTER SYSTEM SET AQ_TM_PROCESSES=0; 

System altered. 

SQL> alter database open; 

Database altered. 

SQL> ALTER DATABASE CHARACTER SET ZHS16GBK; 

ALTER DATABASE CHARACTER SET ZHS16GBK 

* 

ERROR at line 1: 

ORA-12712: new character set must be a superset of old character set 

--提示我们的字符集:新字符集必须为旧字符集的超集,这时我们可以跳过超集的检查做更改:

SQL> ALTER DATABASE character set INTERNAL_USE ZHS16GBK; 

Database altered. 

SQL> select * from v$nls_parameters; 

PARAMETER                                                        VALUE
---------------------------------------------------------------- ----------------------------------------------------------------
NLS_LANGUAGE                                                     SIMPLIFIED CHINESE
NLS_TERRITORY                                                    CHINA
NLS_CURRENCY                                                     ¥
NLS_ISO_CURRENCY                                                 CHINA
NLS_NUMERIC_CHARACTERS                                           .,
NLS_CALENDAR                                                     GREGORIAN
NLS_DATE_FORMAT                                                  DD-MON-RR
NLS_DATE_LANGUAGE                                                SIMPLIFIED CHINESE
NLS_CHARACTERSET                                                 ZHS16GBK
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_NCHAR_CHARACTERSET                                           AL16UTF16
NLS_COMP                                                         BINARY
NLS_LENGTH_SEMANTICS                                             BYTE
NLS_NCHAR_CONV_EXCP                                              FALSE

19 rows selected

-- 此时可以看到,字符集已经改好。


--重启检查是否更改完成:

SQL> shutdown immediate; 

Database closed. 

Database dismounted. 

ORACLE instance shut down. 

SQL> startup 

ORACLE instance started. 

Total System Global Area  236000356 bytes 

Fixed Size                   451684 bytes 

Variable Size             201326592 bytes 

Database Buffers           33554432 bytes 

Redo Buffers                 667648 bytes 

Database mounted. 

Database opened. 

SQL> select * from v$nls_parameters; 

略 

19 rows selected.

 
我们看到这个过程和之前ALTER DATABASE CHARACTER SET操作的内部过程是完全相同的,也就是说INTERNAL_USE提供的帮助就是使Oracle数据库绕过了子集与超集的校验。

注意:如果是操作生产库,一定要慎重。最好不要动字符集。

二是在WebSphere端调整:

1.在网页控制台中修改(这个比较直观,建议使用这种,如果控制台打不开,可以看第2种方法): 

      输入用户名和密码进到WebSphere控制台,操作如下:Servers -> Server Types -> WebSphere application servers -> server1 -> Java and process Management -> Process definition -> Java Virtual Machine -> Generic JVM arguments : -Dfile.encoding=GBK -Ddefault.client.encoding=GBK

2.修改Server.xml文件(注意,在修改任何服务器文件时,一定要先做好备份):

server.xml路径如下:C:\Program Files\IBM\WebSphere\AppServer\profiles\AppSrv01\config\cells\testNode01Cell\nodes\testNode01\servers\server1.xml 

找到文件后,定位到这个字符串 genericJvmArguments=""  修改为  genericJvmArguments="-Dfile.encoding=GBK -Ddefault.client.encoding=GBK"

相关推荐