0

mssql 2005 を使用して、別のアプリケーションのデータベースで動作するアプリケーションを構築しています (それを変更したり、既存のテーブル定義を変更したりすることはできません)。w mssqlテーブルの照合は「ヘブライ語の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

ここで、正確なバイト コードは、テーブルの最初の行の最初のバイトに従って変化します。

はい、私はこれがヘブライ文字に変換されることを知っています-すべての側がユニコードで遊んでいるので、これは問題にはなりません.

ところで - これは、テスト用の 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"('')"))

使用:pyodbc 2.1.11とmssqlサーバー2005、sqlalchemy 0.7.3 tg2.1.3を使用したpython 2.7(64ビット勝利)

助けや参考になれば幸いです

4

2 に答える 2

1

あなたの言うことに基づいて、データベーステーブルのテキスト列はcp1255(Windowsヘブライ語)でエンコードされている可能性が高いですが、コードはUTF-8、おそらくデフォルトでエンコードについて明示的に通知されることを期待しています。

誤った情報を修正するために、どの呼び出しを呼び出すか、sqlalchemyまたは変更する必要があるかを見つける必要があります。pyodbc

于 2011-12-26T20:20:59.317 に答える
0

答えが見つかりました-古典的なwtf。運用サーバーの構成はテストサーバーとはわずかに異なるようです (両方とも同じであるはずでしたが) - nvarchar の代わりに、私のアプリケーションモデルは varchar を取得することを期待していました。助けてくれてありがとう。とにかく質問を書くことで、私の考えを明確にすることができました

于 2011-12-26T20:47:07.573 に答える