2013-02-28 161 views
2

我爲製作字符編碼問題表示歉意,因爲我知道你們每天都會有很多人,但是我無法弄清楚我的問題,因此無論如何我都會問。使用正確的Python編碼從Oracle導入使用正確的編碼

這是我們正在做的:從Oracle數據庫使用Python和cx_Oracle

  1. 取數據。
  2. 使用Python將數據寫入文件。
  3. 使用Python和psycopg2將文件接收到Postgres中。

這裏是重要的Oracle設置:

SQL> select * from NLS_DATABASE_PARAMETERS; 

PARAMETER      VALUE 
------------------------------ ---------------------------------------- 
NLS_LANGUAGE     AMERICAN 
NLS_TERRITORY     AMERICA 
NLS_CURRENCY     $ 
NLS_ISO_CURRENCY    AMERICA 
NLS_NUMERIC_CHARACTERS   ., 
NLS_CHARACTERSET    US7ASCII 

根據這一NLS_LANGfaq,你意思是根據你的客戶端操作系統使用設置NLS_LANG。

運行locale給我們:LANG=en_US.UTF-8(所有其他字段也是en_US.UTF-8)。

所以,在我們的Python腳本,我們設置這樣的:

os.environ["NLS_LANG"] = "AMERICAN_AMERICA.AL32UTF8"

然後我們導入數據,並將其寫入文件。

row = cur.fetchall() 
fil.write(row[0][0]) #For this test, I am only writing one row and one field. 

我們將該文件導入到我們的UTF-8 Postgres數據庫中。

不幸的是,出於某種原因,我們在我們的文件中獲得了這個符號: 在後面的PG表中。如果我的理解是正確的,這是Replace Character。我相信如果Unicode不識別符號,那麼字符就會顯示出來。

(在某些文本編輯器中,符號顯示爲�)。

我不明白的是爲什麼會發生這種情況?我以爲UTF-8向後兼容7位ASCII碼?

即使我們正在使用區域頁面,它不應該仍然有效,因爲客戶端正在使用美國和Oracle服務器正在使用AMERICAN?

如何檢查數據是否正確導入,如果不正確,我如何解決它,以便將來進口?

注意:Oracle字段是CHAR字段,而不是NCHAR字段。注意2:我們使用的是Python 2.4,所以我們在Python 3.X中沒有原生Unicode的東西。所以,雖然我認爲cx_Oracle完全關心了這一點,但Python可能會在某處搞亂。

謝謝你的時間,我希望你有美好的一天。

回答

0

不幸的是,出於某種原因,我們在我們的文件中獲得了這個符號:以及隨後的PG表格。如果我的理解是正確的,那就是替換字符。我相信如果Unicode不識別符號,那麼字符就會顯示出來。

大部分是正確的,但不完全。當使用該編碼時,PostgreSQL將拒絕插入非UTF8文本字符(在StackOverflow上搜索「無效的UTF8 postgresql」)。您看到的字符很可能是您的字體無法識別的有效UTF8字符,因此顯示替換字符。如果符號在你的Oracle數據庫中,並且實際上是那裏的替換符號,那麼你想用什麼替換它?如果是這樣的話,這些信息已經不存在了。

我不明白爲什麼會發生這種情況?我以爲UTF-8向後兼容7位ASCII碼?

它是。

如何檢查數據是否正確導入,如果不正確,我如何解決這個問題以便將來導入?

您的問題很可能是Oracle數據庫的上游。我會發現實際將問題數據插入到Oracle數據庫中並在那裏修復它。如果您可以檢查Pg中的數據與Oracle中的數據,則應該能夠確定數據是否與字符相同(並標記任何差異)。這就是如何檢查你當前的進口。

注意2:我們使用的是Python 2.4,所以我們在Python 3.X中沒有原生Unicode的東西。所以,雖然我認爲cx_Oracle完全關心了這一點,但Python可能會在某處搞亂。

這是另一種可能性。我個人對文件轉換更喜歡Perl,因爲它集成了正則表達式和絕對最高的PostgreSQL支持。不過,我承認您的進口程序在此時可能不易兌換。我比Perl更熟悉Perl中的UTF8轉換問題。不過,如果您可以檢查以二進制格式顯示這些符號的數據,我的確很奇怪。