2017年(38)
分类: Oracle
2017-12-07 13:48:12
異常:開發人員告知切換新系統上線后中文出現亂碼
處理:
1.本地toad連接新系統DB
select和insert發現都不會出現亂碼
2.查看新舊系統DB oracle字符集全部一樣,排除數據庫字符集設置問題
select * from gv$nls_parameters
where parameter in('NLS_LANGUAGE','NLS_TERRITORY','NLS_CHARACTERSET');
NLS_CHARACTERSET都是AL32UTF8
3.排除了DB問題,檢查web server(user client通過web server對DB進行操作)
通知系統管理員檢查web server發現新web server OS(WIN2003)控制面板->地區及語言為英文(美國),而舊系統是中文(臺灣),將新系統改回中文(臺灣),重啟server發現問題依舊。
4.檢查web server中oracle client的NLS_LANG設置
新web server NLS_LANG=AMERICAN_AMERICA.WE8MSWIN1252
舊web server NLS_LANG=TRADITIONAL CHINESE_TAIWAN.ZHT16MSWIN950
一个误区:看到很多人在出现乱码的时候都首先要做的就是将客户端字符集设置和数据库一致,其实这是没有太多根据的。设想一下,假如数据库字符集是AL32UTF8,里面存储这一些中文字符,而我的客户端操作系统是英文的,此时我将客户端的NLS_LANG设置成AL32UTF8,这样会解决问题吗?这样客户端就能显示中文了吗?客户端就能输入中文了吗?现在客户端是英文的,它的字符集里根本就没有汉字的编码,我们简单的修改一下客户端的字符集又有什么用?前面已经讨论了,这个设置无非就是告诉ORACLE我将以什么样的字符集与数据库进行数据交换,对于解决乱码问题毫无关系。
正确的做法是将客户端的操作系统改成支持中文字符,并将客户端字符集改成和操作系统一致的字符集,这样才能真正的解决问题。