2011-12-26 3 views
0

Я создаю приложение, которое работает с db другого приложения, используя mssql 2005 (я не могу изменить это или изменить существующее определение таблицы). w Таблица сопоставления mssql: «Ивритский бит», и приложение показывает идеальный иврит из таблицы, все файлы py закодированы utf-8sqlalchemy UnicodeDecodeError: кодек 'utf8' не может декодировать байт 0xe7 при попытке выбрать все из таблицы msssql 2005

Извещение! нет проблемы с написанием иудейских строк юникода в db с помощью mssql. нет никаких проблем выбора и удаления: 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 

где точные байты-код изменяется в зависимости от первого байта первой строки в таблице.

Да, я знаю, что это означает еврейское письмо - это не должно быть проблемой, поскольку все стороны играют с юникодом - по крайней мере, это то, что я думал.

btw - это отлично работало на тестовом сервере 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 (64-разрядная победа) с pyodbc 2.1.11 vs mssql serv эр 2005, SQLAlchemy 0.7.3 tg2.1.3

рад за любую помощь или ссылки

ответ

0

нашел ответ - классический wtf. кажется, что у производственного сервера была немного другая конфигурация, а затем на тестовом сервере (хотя оба должны были быть одинаковыми), поэтому вместо nvarchar моя модель приложения ожидала, что она получила varchar. Спасибо за помощь. запись вопроса помогла мне очистить мои мысли в любом случае

+0

Тип данных 'NVARCHAR' означает, что текст закодирован в UCS-2, который, как MS, вызывает« Unicode »и который со стороны Python необходимо декодировать с помощью UTF -16LE ... не имеет отношения к UTF-8, насколько я могу судить. –

+0

поэтому в производстве это varchar, который должен работать нормально – alonisser

+0

Насколько я могу судить, NVARCHAR означает, что для декодирования требуется UTF-16LE, VARCHAR означает, что cp1255 необходим для декодирования, а UTF-8 не будет работать ни для одного из них. –

1

Основываясь на том, что вы говорите, весьма вероятно, что текстовые столбцы в таблице базы данных кодируются в cp1255 (Windows иврит) но ваш код ожидает UTF-8, возможно, по умолчанию явно не сказано ничего о кодировке.

Необходимо найти, что нужно знать sqlalchemy или pyodbc необходимо изменить, чтобы исправить ошибки.