今天在客戶服務器上遇到了oracle中文亂碼問題,第一個想到的是:要想避免oracle字符亂碼的問題,需要注意oracle客戶端的字符編碼和服務端的字符編碼保持一致。
於是操作如下:
1、查看服務端字符集--結果:服務端是ZHS16GBK
SELECT * FROM NLS_DATABASE_PARAMETERS where parameter='NLS_CHARACTERSET';
2、於是開始修改客戶端字符集,方式如下:
在運行里面,輸入regedit進入注冊表,HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE\KEY_OraDb11g_home1\里面(最后一項與實例名、數據庫版本有關系),找到NLS_LANG選項,雙擊它,你就可以看到相應的值,修改成AMERICAN_AMERICA.ZHS16GBK
3、查看客戶端字符集--結果:客戶端是AMERICAN_AMERICA.ZHS16GBK(注意:客戶端保證.后面的部分和服務端一致即可)
SELECT USERENV('language') FROM DUAL;
但是做完以上操作如果還是亂碼,於是查看了一下環境變量,發現里面配置了一個NLS_LANG的變量,於是將其值設為AMERICAN_AMERICA.ZHS16GBK,此時直接通過命令行是沒有亂碼問題了,但是嘗試通過plsql查詢數據庫,發現依舊亂碼,這時想到一件事,oracle是64位的,當時通過plsql是不能直接連接的,需要裝32位的客戶端,然后別的同事寫了一個plsqldev.bat文件放到了plsql的根目錄下,才能連接oracle的,於是找到該文件,打開查看,文件內容如下:
@echo off set path=C:\app\Administrator\product\instantclient_10_2 set ORACLE_HOME=C:\app\Administrator\product\instantclient_10_2 set TNS_ADMIN=C:\app\Administrator\product\instantclient_10_2 set NLS_LANG=AMERICAN_AMERICA.AL32UTF8 start plsqldev.exe
這時就明白了,該文件中指定的NLS_LANG是AL32UTF8編碼,於是將其改成set NLS_LANG=AMERICAN_AMERICA.ZHS16GBK,此時plsql使用的32位的oracle客戶端的編碼就和服務端的編碼保持一致了,都是ZHS16GBK,再嘗試通過plsql查詢數據庫,此時亂碼問題解決了。