Python试图通过将一些以字节形式存储在数据库中的文本转换为Python str
对象来提供帮助。为了进行这种转换,Python必须猜测每个查询返回的字节(或字节组)表示什么字母。默认的猜测是一种称为utf-8的编码。显然,在您的情况下,这种猜测是错误的。
解决方法是给Python一点提示,告诉它如何将字节映射到字符(即Unicode字符)。您已经接近答案:
conn.text_factory = str
然而(基于您在上面的评论中的回复),由于您正在使用Python 3,str
是默认的文本工厂,因此该行不会对您产生新的影响(请参见文档)。
这行代码背后发生的事情是Python尝试使用str
函数将查询返回的字节转换为字符串,类似于:
your_string = str(the_bytes, 'utf-8') # actually uses `conn.text_factory`, not `str`
...但你希望使用另一种编码,其中'utf-8'是首选。由于您无法更改str
函数的默认编码,因此您必须以其他方式模拟它。您可以使用一次性的无名称函数称为lambda来实现:
conn.text_factory = lambda x: str(x, 'latin1')
现在当数据库将字节交给Python处理时,Python会尝试使用'latin1'编码方案而不是'utf-8'编码方案将它们映射为字母。当然,我不知道latin1是否是您数据的正确编码方式。实际上,您需要尝试一些编码方式才能找到正确的编码方式。我建议首先尝试以下方式:
'iso-8859-1'
'utf-16'
'utf-32'
'latin1'
您可以在此处找到更完整的列表(链接)。
另一个选择是让从数据库出来的字节保持为字节。这对您是否是个好主意取决于您的应用程序。您可以通过设置以下代码来实现:
conn.text_factory = bytes