我爲製作字符編碼問題表示歉意,因爲我知道你們每天都會有很多人,但是我無法弄清楚我的問題,因此無論如何我都會問。使用正確的Python編碼從Oracle導入使用正確的編碼
這是我們正在做的:從Oracle數據庫使用Python和cx_Oracle
- 取數據。
- 使用Python將數據寫入文件。
- 使用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_LANG
faq,你意思是根據你的客戶端操作系統使用設置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可能會在某處搞亂。
謝謝你的時間,我希望你有美好的一天。