我正在構建一個應用程序,與另一個應用程序的數據庫一起使用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
很高興的任何幫助或根據你說的話
數據類型'NVARCHAR'意味着文本在UCS-2中編碼,這就是MS看起來叫做「Unicode」的東西,而來自Python端的東西需要用UTF解碼-16LE ......就我所知,與UTF-8無關。 – 2011-12-27 11:43:10
所以在生產中它是varchar應該工作正常 – alonisser 2011-12-27 18:21:25
據我所知,NVARCHAR意味着UTF-16LE需要解碼,VARCHAR意味着需要cp1255解碼,而UTF-8在任何情況下都不起作用。 – 2011-12-27 19:33:32