環境:Python3.x+cx_Oracle6.x
結論:只要 客戶端的NLS_LANG設置與oracle數據庫服務器的一致,且NLS_LANG不為WE8ISO8859P1,則漢字顯示正常。
故有必要將字符集為WE8ISO8859P1的oracle數據庫,改為ZHS16GBK、UTF8等。實在不能修改字符集的話,則凡是出現漢字的地方,都要進行轉碼:x.encode('latin1').decode('gbk') ——x為數據庫里有漢字的字段。
本人親測:
oracle數據庫的原字符集為ZHS16GBK,將其改為WE8ISO8859P1,以便導入字符集為WE8ISO8859P1的dmp文件;導入后再將oracle數據庫的字符集改回,漢字顯示正常:
1、 將老oracle的數據導出,字符集編碼為WE8ISO8859P1
2、新oracle數據服務器本身的編碼為 ZHS16GBK。為導入編碼為WE8ISO8859P1的dmp文件,臨時改為 WE8ISO8859P1。並修改os的注冊表或環境變量,使NLS_LANG=WE8ISO8859P1。然后重啟oracle服務。
3、導入 dmp文件(其真實的字符集亦為WE8ISO8859P1)。若在 客戶機使用 imp 導入,注意客戶機的NLS_LANG,務必是 WE8ISO8859P1。
4、將oracle數據庫的字符集改回 ZHS16GBK,修改os的注冊表或環境變量,使NLS_LANG= ZHS16GBK。然后重啟oracle服務。
5、查詢:漢字正常。
注一:exp導出的包,直接修改對應的字節,可以騙過imp程序:導入時不報錯。但是讀取時,漢字亂碼。
注二:網上高手說的修改oracle數據庫字符集能成功的原理: