比较由编码引起的散列时出错

时间:2013-06-19 11:59:49

标签: python mysql unicode sqlalchemy

我正在尝试将php应用程序转换为python应用程序,并且我陷入了哈希

使用MySQL和SQLAlchemy有ORM

的MySQL

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

SQLAlchemy的

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

我不确定如何将最后两个转换为十六进制或者它们是否相同。

1 个答案:

答案 0 :(得分:1)

最后两个相同。第一个十六进制序列是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

但你的第二个值是 unicode 字符串;它使用Python \uxxxx unicode codepoint escapes:

>>> 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设置会返回\x96\x94而不是\u2013\u201d代码点;我没有直接看到那里的相关性。

您可能需要配置SQLAlchemy连接器以匹配此MySQL数据库中使用的编码,如果需要,在数据库连接级别,表级别甚至列级别设置charset参数。