在Linux下oracle数据库碰到字符乱码的解决方法
linux下Oracle显示中文乱码的情况和原因
操作系统与服务器一致,但客户端与服务器字符集不一致
客户端与服务器一致,但操作系统与服务器不一致
解决办法
设置相关的字符集,保证操作系统、客户端、数据库服务器,保证这三者的字符集都相同。
1在linux下查看oracle数据库服务器字符集的命令
查看数据库字符集 select userenv(‘language’) from dual;
显示
AMERICAN_AMERICA.ZHS16GBK;
1
说明这个数据库的字符集不是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
1
在.bash_profile中加入环境变量
export NLS_LANG=AMERICAN_AMERICA.UTF8
1
$ source .bash_profile` //执行source命令使修改完的.bash_profile文件生效
1
这样客户端的字符集也修改成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数据库的测试环境时,对表插入中文,修改,查询都正常显示了,不会再有乱码的问题了