2013-06-19 37 views
0

我想一個PHP應用程序轉換成一個Python一個哈希和我被困在哈希錯誤的比較,由於編碼

使用MySQL和SQLAlchemy的有ORM

MySQL的

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

SQLAlchemy的

client_hash = Column(Unicode) 

我曾嘗試其他類型,如VARCHAR,但它似乎GI我的哈希值離我所尋找的更遠。

當我查看已在phpMyAdmin它看起來像

ù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

最後兩個是不是一樣。第一個十六進制序列是一個Python字節字符串的原始表示;從拉丁語-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碼點逃逸:

>>> 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參數。