Я создаю приложение, которое работает с 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
рад за любую помощь или ссылки
Тип данных 'NVARCHAR' означает, что текст закодирован в UCS-2, который, как MS, вызывает« Unicode »и который со стороны Python необходимо декодировать с помощью UTF -16LE ... не имеет отношения к UTF-8, насколько я могу судить. –
поэтому в производстве это varchar, который должен работать нормально – alonisser
Насколько я могу судить, NVARCHAR означает, что для декодирования требуется UTF-16LE, VARCHAR означает, что cp1255 необходим для декодирования, а UTF-8 не будет работать ни для одного из них. –