0

PHPアプリケーションをPythonアプリケーションに変換しようとしていますが、ハッシュに固執しています

MySQL と SQLAlchemy の使用には ORM があります

MySQL

field : client_hash
type : varchar(20)
collation: Latin1_bin

SQL錬金術

client_hash = Column(Unicode)

varchar などの他のタイプを試しましたが、探しているものからさらに離れたハッシュが得られるようです。

phpmyadmin で has を表示すると、次のようになります

ù3×þØc(    7JûìÎËþf–E”

クライアントからこのハッシュを取得します

\xf93\xd7\xfe\xd8c(\t\x9d7J\xfb\xec\xce\xcb\xfef\x96E\x94

そして、サーバーはこれを正解として除外しています

\xf93\xd7\xfe\xd8c(\t\x9d7J\xfb\xec\xce\xcb\xfef\u2013E\u201d

最後の2つを16進数に変換する方法、またはそれらが同じであるかどうかはわかりません。

4

1 に答える 1

1

最後の 2 つは同じではありません。最初の 16 進シーケンスは、Python バイト文字列の生の表現です。Latin-1 から次のようにデコードされます。

>>> '\xf93\xd7\xfe\xd8c(\t\x9d7J\xfb\xec\xce\xcb\xfef\x96E\x94'.decode('latin1')
u'\xf93\xd7\xfe\xd8c(\t\x9d7J\xfb\xec\xce\xcb\xfef\x96E\x94'
>>> print '\xf93\xd7\xfe\xd8c(\t\x9d7J\xfb\xec\xce\xcb\xfef\x96E\x94'.decode('latin1')
ù3×þØc( 7JûìÎËþfE

しかし、2 番目の値はUnicode文字列です。Python \uxxxxUnicode コードポイント エスケープを使用します。

>>> u'\xf93\xd7\xfe\xd8c(\t\x9d7J\xfb\xec\xce\xcb\xfef\u2013E\u201d'
u'\xf93\xd7\xfe\xd8c(\t\x9d7J\xfb\xec\xce\xcb\xfef\u2013E\u201d'
>>> print u'\xf93\xd7\xfe\xd8c(\t\x9d7J\xfb\xec\xce\xcb\xfef\u2013E\u201d'
ù3×þØc( 7JûìÎËþf–E”

したがって、Unicode リテラル値は、phpmyadmin で表示されるものと一致します。

最後の 3 文字を除いて同じです。

>>> latin1 = '\xf93\xd7\xfe\xd8c(\t\x9d7J\xfb\xec\xce\xcb\xfef\x96E\x94'.decode('latin1')
>>> unicode_literal = u'\xf93\xd7\xfe\xd8c(\t\x9d7J\xfb\xec\xce\xcb\xfef\u2013E\u201d'
>>> latin1[:-3] == unicode_literal[:-3]
True
>>> latin1[-2] == unicode_literal[-2]
True
>>> latin1[-1] == unicode_literal[-1]
False
>>> latin1[-3] == unicode_literal[-3]
False

これ以上の情報がなければ、MySQL セットアップがコードポイントとコードポイントの代わりに and を返す理由を判断するのは困難です\x96。私はそこに相関関係を直接見ません。\x94\u2013\u201d

おそらく、この MySQL データベースで使用されるエンコーディングと一致するように SQLAlchemy コネクタを構成し、必要に応じてcharsetデータベース接続レベル、テーブル レベル、さらには列レベルでパラメーターを設定する必要があります。

于 2013-06-19T12:22:28.773 に答える