2017-06-17 64 views
0

免責聲明解碼字節0×81:我有編碼的鬥爭。SQLAlchemy的編解碼器無法與Oracle WE8ISO8859P1編碼

我使用SQLAlchemy的拉從Oracle 12數據庫中的某些數據與WE8ISO8859P1字符集(根據NLS_CHARACTERSET

某處有在數據庫中(假設一個人的名字)的值當值傳遞給Python時,它會引發錯誤。

UnicodeDecodeError: 'charmap' codec can't decode byte 0x81 in position 4: character maps to <undefined> 

代碼是:

Base = declarative_base() 

class Person(Base): 
    __tablename__= 'PERSON' 

    id = Column(Integer,primary_key=True) 
    lastname = Column(String) 
    firstname = Column(String) 
    middlename = Column(String) 
    active = Column(Integer) 
    sex = Column(String) 
    dateofbirth = Column(String) 

engine = create_engine('oracle://USER:[email protected]:1521/ORCL', echo=True) 

Session = sessionmaker(bind=engine) 

session = Session() 

testList = [] 


for user in session.query(Person).all(): 
    testList.append(user) 

檢查在Oracle V $ session_connect_info我看到,運行該代碼的客戶端與字符連接設置WE8MSWIN1252

我知道Python中使用Unicode,所以它看起來像我有3種不匹配的編碼,我真的不知道從哪裏開始。

我應該......

  1. 嘗試更改Oracle客戶端上的編碼(Windows機器,但我看到UTF-8與其他Windows客戶端)
  2. 嘗試更改編碼create_engine腳本? (我試圖通過encoding='WE8ISO8859P1',並沒有接受
  3. 嘗試捕獲錯誤並將值更改爲其他

獎金:?究竟是什麼0×81也許這甚至不應該在一個人的名字編碼

+1

請註明完整回溯cx_Oracle將自動完成轉換的字符串。 –

回答

0

您有幾種選擇:?

conn = cx_Oracle.connect("user/[email protected]", encoding = "ISO-8859-1", nencoding = "UTF-8") 

或者你可以簡單地設置環境變量NLS_LANG和NLS_NCHAR

NLS_LANG=.WE8ISO8859P1 
NLS_LNCHAR=AL32UTF8 

請注意,還可以使用編碼= 「UTF-8」 在cx_Oracle連接()方法,作爲ISO-8859-1被容易地轉換爲UTF-8。如果你正在使用Python 3

相關問題