2015-09-16 102 views
1

給定以下代碼 windows上的輸出具有完整的8位字節,因爲在Mac上,該字符串已被編碼爲7位ASCII,其編碼看起來像「替換」。Sqlalchemy CLOB在Windows和Mac上返回不同的結果

MAC 25 50 44 46 2D 31 2E 33 0A 25 43 69 3F 3F 0A 35 20 30 20 6F 62 6A 0A 3C圖3C 2F

WINDOWS 25 50 44 46 2D 31圖2e 33 0A 25 C7 EC 8F A2 0A 35 20 30 20 6F 62 0A 6A 3C圖3C 2F

我有SQLAlchemy的,蟒,CX-Oracle和即時客戶的同一版本安裝

我已經嘗試了不同的convert_unicode/coerse_unicode型標誌無濟於事

任何幫助,將不勝感激

from sqlalchemy import Table, MetaData 
from sqlalchemy import create_engine 
from sqlalchemy.sql import select 


if __name__ == '__main__': 

    connection_string = 'oracle+cx_oracle://user:[email protected]:1521/orcl' 
    engine_args = { 
    'echo': False, 
    'convert_unicode': True, 
    'coerce_to_unicode': True 
    } 
    src_engine = create_engine(connection_string, **engine_args) 
    metadata = MetaData() 

    table = Table('POLICY_CONTRACT', metadata, autoload=True, autoload_with=src_engine, schema='TROPICS_POLICY') 
    s = select(table.columns) 
    q = src_engine.execute(s) 
    r = q.fetchone() 

    for k in r.keys(): 
    v = r[k] 
    if k == 'contract_content': 
     v1 = " ".join(["{0:02x}".format(ord(x)) for x in v]) 
     print("{0} : {1} : {2}\n".format(k, type(v), v[:100])) 

回答

0

只是一個猜測,但你的Oracle 客戶字符集可能是你的Windows安裝程序之間的不同, Mac設置。當客戶端字符集與數據需求不同時,可能會發生一些轉換。從Globalization Support Guide

設置NLS_LANG正確地實現從客戶端 操作系統字符編碼爲數據庫字符集正確轉換。 當這些設置相同時,Oracle數據庫會假定發送或接收的數據被編碼爲與數據庫字符集相同的字符集 ,因此可能無法執行字符集驗證或轉換 。如果轉換需要 ,這可能會導致數據損壞。

在從一個字符集轉換爲另一個字符集期間,Oracle數據庫 預計客戶端數據將由NLS_LANG參數指定的字符集指定爲 。如果將其他值放入字符串 (例如,通過使用CHR或CONVERT SQL函數),那麼 值發送到數據庫時可能會損壞,因爲 它們未被正確轉換。如果您已經正確配置了 環境,並且數據庫字符集支持可能輸入到 數據庫的整個字符數據庫,則不需要更改當前數據庫 字符集的 。然而,如果你的企業變得更加全球化, 您有其他字符或新的語言支持,那麼你 可能需要選擇一個角色具有更大的字符集設置

您可以通過檢查服務器設置檢查:

select * from v$nls_parameters; 

檢查NLS_CHARACTERSET

在Windows客戶端,檢查NLS_LANG進入註冊表(或回聲%NLS_LANG%,如果ENV variabl e被設定)。在Unix/Linux上,嘗試echo $ NLS_LANG。不確定Mac,但也許Unix方法也可以。 (如果沒有設置,我相信它默認爲US7ASCII)

如果Mac與您的數據庫服務器不同(我猜Mac是US7ASCII),那麼先嚐試導出不同的NLS_LANG,然後運行您的查詢。例如

export NLS_LANG=AMERICAN_AMERICA.WE8ISO8859P1 

更多細節here

+0

感謝您指出我在正確的方向 我通過添加下面一行到我的Python腳本 os.putenv(「NLS_LANG」,「AMERICAN_AMERICA.WE8MSWIN1252排序的問題') – user3066737

+0

上面的設置對我來說不適用於python 3,因此我最終使用os.putenv('NLS_LANG','_.WE8ISO8859P1') 這就是LATIN1 – user3066737

+0

很高興聽到它的幫助,如果這解決了您的問題隨時接受答案,謝謝 – tbone

相關問題