最后两个不一样。第一个十六进制序列是 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 代码点转义:
>>> 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
如果需要,在数据库连接级别、表级别甚至列级别设置参数。