Linux环境解决Oracle 中文乱码

1)查看数据库字符集

03:12:58 SQL> select userenv('language') from dual; 
USERENV('LANGUAGE')
----------------------------------------------------
AMERICAN_AMERICA.ZHS16GBK

2)编辑linux 的NLS_LANG变量

[oracle@oraserv ~]$ pwd

/home/oracle

[oracle@oraserv ~]$ ls -a

.                      cr_dbprod.sql .gconfd            .ICEauthority .rman_history     .Xauthority
..                     cr_db.sql      .gnome             logmnr         sel.sql           .xsession-errors
.bash_history          cr_dict.sql    .gnome2            .metacity      sql.log           中国
.bash_logout           Desktop        .gnome2_private    .mozilla       sqlnet.log
.bash_profile          .dmrc          .gstreamer-0.10    .nautilus      .sqlplus_history
.bashrc                .eggcups       .gtkrc-1.2-gnome2 ora.sh         s.sh
close_bak_command.sql ftp.msg        hot_bak_cmd.sql    ora.txt        start.sh
cold_bak.sql           .gconf         hot_bak.sql        .redhat        .Trash

[oracle@oraserv ~]$ vi .bashrc

 

# .bashrc
# Source global definitions
if [ -f /etc/bashrc ]; then
        . /etc/bashrc
fi
# User specific aliases and functions
export NLS_LANG=AMERICAN_AMERICA.ZHS16GBK
 
".bashrc" 10L, 167C written

3)注销oracle用户,重新登录

[oracle@oraserv ~]$ su - oracle
[oracle@oraserv ~]$ env |grep LANG
NLS_LANG=AMERICAN_AMERICA.ZHS16GBK
LANG=en_US.UTF-8

[oracle@oraserv ~]$ export ORACLE_SID=prod
[oracle@oraserv ~]$ env |grep LANG
NLS_LANG=AMERICAN_AMERICA.ZHS16GBK
LANG=en_US.UTF-8

通过sqlplus验证:
[oracle@oraserv ~]$sqlplus '/as sysdba';
SQL*Plus: Release 10.2.0.1.0 - Production on Fri Apr 8 03:15:59 2011 
Copyright (c) 1982, 2005, Oracle. All rights reserved.
Connected to:
Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Production
With the Partitioning, OLAP and Data Mining options
 
03:16:02 SQL> conn scott/tiger
Connected.
03:16:08 SQL> select * from tab;
 
TNAME                          TABTYPE CLUSTERID
------------------------------ ------- ----------
DEPT                           TABLE
EMP                            TABLE
BONUS                          TABLE
SALGRADE                       TABLE
 
03:16:16 SQL> update dept set dname='财务' where deptno=10;
1 row updated.
 
03:16:47 SQL> select * from dept;
    DEPTNO DNAME          LOC
---------- -------------- -------------
        10 财务   NEW YORK
        20 RESEARCH       DALLAS
        30 SALES          CHICAGO
        40 OPERATIONS     BOSTON

注意:解决问题的原则,客户端的字符集和oracle 数据库的字符集保持一致。