在Linux下oracle数据库碰到字符乱码的解决方法
linux下Oracle显示中文乱码的情况和原因
DEPTNO DNAME LOC
---------- -------------- -------------
41 41??????dname 41??????loc
31 31??????dname 31??????loc
55 50dname 50loc
操作系统与服务器一致,但客户端与服务器字符集不一致
客户端与服务器一致,但操作系统与服务器不一致
解决办法
设置相关的字符集,保证操作系统、客户端、数据库服务器,保证这三者的字符集都相同。
1在linux下查看oracle数据库服务器字符集的命令
查看数据库字符集 select userenv('language') from dual;
显示
AMERICAN_AMERICA.ZHS16GBK;
说明这个数据库的字符集不是utf-8
2 更改数据库服务器端的字符集
sqlplus sys/ as sysdba;//以管理员的身份登陆oracle数据库
执行以下命令
shutdown immediate; (把database停了)
startup mount; (把database重开去可更改情況)
alter system enable restricted session;
alter system set job_queue_processes=0;
alter system set aq_tm_processes=0;
alter database open;
alter database character set internal_use utf8;
shutdown immediate;
startup; (重开正常oracle)
再次执行命令
select userenv('language') from dual;
出现AMERICAN_AMERICA.UTF8
明服务器的字符编已经修改为utf8格式
**3查看客户端环境变量
执行命令
echo $NLS_LANG
**
出现AMERICAN_AMERICA.ZHS16GBK;
说明客户端的字符编码不是utf8格式的
4配置当前用户的环境变量,将客户端的字符集改为utf8格式
vi .bash_profile
在.bash_profile中加入环境变量
export NLS_LANG=AMERICAN_AMERICA.UTF8
$ source .bash_profile` //执行source命令使修改完的.bash_profile文件生效
这样客户端的字符集也修改成utf8格式的
5操作系统字符集的修改
cat /etc/sysconfig/i18n
//查看linux配置文件里默认设置的字符集字体
# vim /etc/sysconfig/i18n //修改i18n里面linux的默认字符集
i18n文件内容如下:
LANG="en_US.GBK"
//把这一项的值改成UTF8字符集,改为:LANG="en_US.UTF-8" en_
US代表系统本身是用英文显示的,中文为:zh_CN编码格式是UTF-8
# source /etc/sysconfig/i18n
//执行source 命令使i18n文件的修改生效.
修改完后,再切换回oracle用户,再用命令locale或者是echo $LANG查看下当前的操作系统字符集,你会发现已经和客户端和数据库的一致了,都是UTF8.这个时候你再进入oracle数据库的测试环境时,对表插入中文,修改,查询都正常显示了,不会再有乱码的问题了