0

我正在使用 mssql 2005 构建一个与另一个应用程序的数据库一起使用的应用程序(我无法更改它或更改现有的表定义)。w mssql 表排序为:“hebrew bin”,应用程序从表中显示完美的希伯来语,所有 py 文件都编码为 utf-8

注意!使用 mssql 将 unicode 希伯来语字符串写入数据库没有问题。选择和删除没有问题:DBSession2.query(object).filter(object.LOADED=='Y').delete() 但是从表中选择时,我得到了这个非常烦人的错误:

  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 server 2005,sqlalchemy 0.7.3 tg2.1.3

很高兴获得任何帮助或参考

4

2 回答 2

1

根据您所说的,数据库表中的文本列很可能是用cp1255(Windows 希伯来语)编码的,但您的代码是预期的UTF-8,可能默认情况下没有明确告知任何有关编码的内容。

您需要找到调用sqlalchemypyodbc需要修改的内容以纠正错误信息。

于 2011-12-26T20:20:59.317 回答
0

找到了答案——经典的 wtf。似乎生产服务器的配置与测试服务器略有不同(尽管两者都应该是相同的) - 所以我的应用程序模型不是 nvarchar,而是期望它得到 varchar。谢谢您的帮助。无论如何,写这个问题帮助我理清思路

于 2011-12-26T20:47:07.573 回答