1. 程式人生 > ><h1>CX_ORACLE漢字亂碼的處理</h1>

<h1>CX_ORACLE漢字亂碼的處理</h1>

數據庫服務器 http lang pan info acl ont tro zhs16gbk

   環境: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數據庫字符集能成功的原理:

技術分享圖片

<h1>CX_ORACLE漢字亂碼的處理</h1>