2011-12-26 73 views
0

我正在構建一個應用程序,與另一個應用程序的數據庫一起使用mssql 2005(我無法改變或更改現有的表格定義)。 w希望對你有幫助,希望對大家有幫助,希望對大家有所幫助。用unicode希伯來語字符串用mssql寫入db是沒有問題的。 沒有煩惱選擇和刪除:DBSession2.query(object).filter(object.LOADED=='Y').delete() 但是從表中選擇時,我得到這個非常惱人的錯誤:sqlalchemy UnicodeDecodeError:'utf8'編解碼器無法解碼字節0xe7當試圖從msssql 2005選擇所有表

File "D:\Python27\learn\agent\agent\lib\encodings\utf_8.py", line 16, in decode  return codecs.utf_8_decode(input, errors, True) 
UnicodeDecodeError: 'utf8' codec can't decode byte 0xe0 in position 0: invalid continuation byte 

其中根據該表的第一行的第一個字節確切的字節代碼更改。

是的,我知道這意味着一個希伯來文 - 這不應該是一個問題,因爲各方都玩unicode - 至少這是我的想法。

順便說一句 - 這工作正常在測試MSSQL 2005服務器,但不適用於生產服務器。

一些代碼: 這是函數的發生故障的部分:

def iterateJson(parser,injson,object): 
    '''iterateJson(parser,injson,object):getting a parser method an a json and iterating over the json 
    with the parser method, checkes for existing objects in the db table and deletes them before commiting the new one to 
    prevent integerityerrors 
    writes ValidateJsonError to errorlog for each element in the json 
    getting an onject name to check for loaded etc''' 

    #first lets erase the table from loaded objects 
    DBSession2.query(object).filter(object.LOADED=='Y').delete() 
    print "finished deleting loaded" 
    #now lets get a list from the table of loaded id 
    raw_list = DBSession2.query(object).all() #the failing part! 
    print "getting raw list of unloaded" #doesn't get here! 
    if object == Activities: 
     id_list = [e.EVENTCODE for e in raw_list] 
     id = e.EVENTCODE 

這是SQLAlchemy的類的一部分:

class Deposit(DeclarativeBase2): 
    __tablename__ = 'NOAR_LOADDEPOSIT' 
    #LINE = Column(INT(8)) 
    RECDEBNUM = Column(NVARCHAR(9) , primary_key=True) 
    CURDATE = Column(BIGINT, nullable=False, default=text(u'((0))')) 
    PAYTYPE = Column(CHAR(1), nullable=False, default=text(u"('')")) 
    BANKCODE = Column(NVARCHAR(8), nullable=False, default=text(u"('')")) 
    CUSTACCNAME = Column(NVARCHAR(16), nullable=False, default=text(u"('')")) 
    PAGENUM = Column(NVARCHAR(5), nullable=False, default=text(u"('')")) 
    RECNUM = Column(NVARCHAR(2), nullable=False, default=text(u"('')")) 
    RECDATE = Column(BIGINT, nullable=False, default=text(u'((0))')) 
    FIXNUM = Column(NCHAR(1), nullable=False, default=text(u"('')")) 
    EVENTNUM = Column(NVARCHAR(5), nullable=False, default=text(u"('')")) 
    GROUPCODE = Column(NVARCHAR(7), nullable=False, default=text(u"('')")) 
    IDNUMBER = Column(NVARCHAR(9), nullable=False, default=text(u"('')")) 

和其他類(包括給予了同樣的問題)

class Activities(DeclarativeBase2): 


    __tablename__ = 'NOAR_LOADEVENTS' 

    EVENTCODE = Column(NVARCHAR(8), primary_key=True) 
    EVENTDES = Column(Unicode, nullable=False, default=text(u"('')")) 
    TYPE = Column(NCHAR(1), nullable=False, default=text(u"('')")) 
    LC = Column(NCHAR(1), nullable=False, default=text(u"('')")) 
    LD = Column(NCHAR(1), nullable=False, default=text(u"('')")) 
    LE = Column(NCHAR(1), nullable=False, default=text(u"('')")) 
    LF = Column(NCHAR(1), nullable=False, default=text(u"('')")) 
    LG = Column(NCHAR(1), nullable=False, default=text(u"('')")) 
    LH = Column(NCHAR(1), nullable=False, default=text(u"('')")) 

使用:python 2.7(64bit win)與pyodbc 2.1.11 vs mssql serve R 2005,SQLAlchemy的0.7.3 tg2.1.3

很高興的任何幫助或根據你說的話

回答

0

找到了答案 - 一個經典的跆拳道。似乎生產服務器與測試服務器有稍微不同的配置(儘管兩者應該是相同的) - 所以不是nvarchar,我的應用程序模型期望得到varchar。謝謝您的幫助。寫這個問題幫我清除了我的想法

+0

數據類型'NVARCHAR'意味着文本在UCS-2中編碼,這就是MS看起來叫做「Unicode」的東西,而來自Python端的東西需要用UTF解碼-16LE ......就我所知,與UTF-8無關。 – 2011-12-27 11:43:10

+0

所以在生產中它是varchar應該工作正常 – alonisser 2011-12-27 18:21:25

+0

據我所知,NVARCHAR意味着UTF-16LE需要解碼,VARCHAR意味着需要cp1255解碼,而UTF-8在任何情況下都不起作用。 – 2011-12-27 19:33:32

1

引用,這是極有可能的是,在數據庫表中的文本列cp1255(希伯來文的Windows)的編碼但你的代碼期望UTF-8,也許默認情況下是明確告訴任何有關編碼的東西。

您需要找到需要修改以改正錯誤信息的呼叫號碼爲sqlalchemypyodbc

相關問題