从MYSQL读取模型时出现DjangoUnicodeDecodeError

时间:2014-04-02 03:14:15

标签: python mysql django unicode

好的,我很难过。我有一个非常简单的数据库查询与Django模型如下:

items=models.Item.objects.all()

一旦我尝试运行它,我得到一个例外:

DjangoUnicodeDecodeError:' utf8'编解码器不能解码位置1中的字节0xe4:无效的连续字节。你传入了'E \ xe4I \ n \ x01 \ x80 \ xc0 \ xc9 \ xa3 \ xd0-m \ xd1c%\ x7f' ()

Item模型没有什么特别复杂的。我进入MYSQL并运行show table status并且所有表都使用utf8_general_ci collat​​ion。我不知道如何解决这个问题。有什么想法吗?

我还应该提一下,我在运行Django模型管理命令的一些代码中运行它。换句话说,在我的models / management / commands文件夹中,我有一个python文件(比如do_stuff.py),我用./manage.py do_stuff执行它。所以这一切都是从命令行运行的,即没有涉及浏览器,没有模板等。只是一个自定义的Djanago命令。

2 个答案:

答案 0 :(得分:0)

我不是unicode专家,但似乎你的数据不是utf-8,而是utf-16。

您可以尝试:

In [10]: b = b'E\xe4I\n\x01\x80\xc0\xc9\xa3\xd0-m\xd1c%\x7f'

In [11]: b.decode('utf-8')
---------------------------------------------------------------------------
UnicodeDecodeError                        Traceback (most recent call last)
<ipython-input-11-dbeeccecf491> in <module>()
----> 1 b.decode('utf-8')

/usr/lib/python2.7/encodings/utf_8.pyc in decode(input, errors)
     14 
     15 def decode(input, errors='strict'):
---> 16     return codecs.utf_8_decode(input, errors, True)
     17 
     18 class IncrementalEncoder(codecs.IncrementalEncoder):

UnicodeDecodeError: 'utf8' codec can't decode byte 0xe4 in position 1: invalid continuation byte

In [12]: print b.decode('utf-16')
੉老지킣洭揑缥

答案 1 :(得分:0)

嗯,事实证明我在Item中有一个加密数据字段。看起来在编码中存在一些问题 - 也许数据库的默认编码不是utf8。在任何情况下,我都可以通过清空这个字段来避免这个问题,因为我不需要它。不是最令人满意的解决方案,但至少它让我继续前进。我怀疑最好的解决方案确实是确保数据库格式化为默认使用UTF8,然后再放入任何内容。