Oracle web界面乱码分析

问题描述web界面乱码,厂商给我一个sql文件,需要新建用户,然后新建表空间,然后执行人家的sql文件,刚开始什么没注意字符集问题直接执行了,很顺利的执行成功,然后启动tomcat,web界面居然乱码了!

环境介绍:contos 6.9 +oracle 11g

数据库的字符集为:

SQL> select userenv('language') nls_lang from dual;

NLS_LANG

----------------------------------------------------

AMERICAN_AMERICA.ZHS16GBK

解决办法:思路:需要保证数据库和tomcat的字符集保证一致,然后设置Oracle用户的环境变量nls_lang和lang,保险起见可以把启动tomcat的用户的环境变量lang也设置成一样的,如果想批量直接执行sql文件,需要保证sql文件也是一样的字符集! 1.首先设置了oracle用户的LNG和NLS_LANG两个环境变量:

linux中有两个配置编码的参数LANG和NLS_LANG。LANG是针对Linux系统的语言、地区、字符集的设置,对linux下的应用程序有效,如date;NLS_LANG是针对Oracle语言、地区、字符集的设置,对oracle中的工具有效。    

[oracle@tvf-ncMobileapproval-oracle-01 ~]$  export  LANG=zh_CN.GB2312

[oracle@tvf-ncMobileapproval-oracle-01 ~]$ export NLS_LANG=AMERICAN_AMERICA.ZHS16GBK

之后编辑一个sql文件,然后将人家给的脚本内存拷贝进去,然后查看该文件的字符集,不再是utf-8了!

[oracle@tvf-ncMobileapproval-oracle-01 ~]$ vi 6.sql  

[oracle@tvf-ncMobileapproval-oracle-01 ~]$ file -i 6.sql 6.sql: text/x-po; charset=iso-8859-1

或者不用copy的方式,直接通过sz 或者ftp等工具直接把厂商的sql文件上传到服务器上,然后通过命令修改文件的字符集:如下具体过程 首先查看需要转换字符集的文件的原始字符集,需要保证文件的字符集和数据库的字符集一样! 注意 charset=iso-8859-1就和gbk兼容!

[oracle@tvf-ncMobileapproval-oracle-01 ydpttomcat]$ file -i ydptdb.sql

ydptdb.sql: text/x-po; charset=utf-8

使用iconv命令转换文件字符集:

[oracle@tvf-ncMobileapproval-oracle-01 ydpttomcat]$ iconv -f utf-8 -t gb2312 /data/ydpttomcat/ydptdb.sql >/data/u01/1.sql 再次查看文件字符集发现已经改变了:

[oracle@tvf-ncMobileapproval-oracle-01 u01]$ file -i 1.sql 1.sql: text/x-po;

charset=iso-8859-1 然后可以直接登陆数据库,然后倒进数据库了!

2.tomcat的配置文件字符集为gbk,然后重启tomcat!!!

可以通过这个命令来找到tomcat的配置文件的路径

[root@tvf-ncMobileapproval-oracle-01 /data/ydpttomcat]# grep -i  -R  "URIEncoding"

ydptapps/mobem/META-INF/maven/com.yonyou.iuap/mobem/pom.xml:                    <uriEncoding>GBK</uriEncoding>然后最好修改下启动tomcat服务的用户的环境变量,然后启动tomcat

需要保证数据库和tomcat的字符集保证一致,然后设置Oracle用户的环境变量nls_lang和lang,保险起见可以把启动tomcat的用户的环境变量lang也设置成一样的,如果想批量直接执行sql文件,需要保证sql文件也是一样的字符集! 最好的,最不容易出字符集错误的就是:将数据库字符集、客户端字符集、客户端操作系统NLS_LANG参数三个地方作同样的设置。

重点说下Oracle数据库字符集读取和插入的时候转换过程

insert 的过程: 首先以Oracle客户端的字符集(lang)编码------->然后通过客户端nls_lang告诉sqlplus是以那种字符集编码的------->然后Oracle数据库得知nls_lang后,借助自己的编码表来转换成数据库的字符集,如果使用lang=utf8编码,然后nls_lang=gbk,等Oracle转换的时候,通过gbk的编码表来转换,那么肯定会乱码的!!!!!!!所以只需要lang和nls_lang一样,那么insert就不会乱码!!!!不管数据库的字符集和他一样不一样!!!也就是说Oracle会做字符集转换的工作,客户端不会转换,只会根据lang来查找对应的字符串,

select的过程: Oracle数据库根据数据库的字符集utf8把查询的内容进行编码--------->然后告诉sqlplus程序我查出来的内容是以utf8进行编码的,然后sqlplus告诉Oracle他们需要的是nls_lang=gbk,于是Oracle发现不一样,这样Oracle就根据自己的编码表来找gbk的对应编码,然后传给sqlplus程序------>sqlplus直接把得到的这串编码扔给客户端操作系统,而操作系统只是有ZHS16GBK编码表(假如lang= ZHS16GBK ),它不会问得到的这串编码是什么格式的!

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/29654823/viewspace-2219825/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/29654823/viewspace-2219825/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值