2014-04-02 47 views
0

好吧,我很難過。我有Django模型非常簡單的數據庫查詢,如下所示:當我嘗試運行此我得到一個異常從MYSQL讀取模型時DjangoUnicodeDecodeError

items=models.Item.objects.all() 

DjangoUnicodeDecodeError:在「UTF-8」編解碼器不能解碼字節0xe4位置1:無效的連續字節。您通過'E \ xe4I \ n \ x01 \ x80 \ xc0 \ xc9 \ xa3 \ xd0-m \ xd1c%\ x7f'()

沒有什麼特別複雜的項目模型。我進入MYSQL並運行顯示錶狀態,所有表使用utf8_general_ci排序規則。我不知道如何解決這個問題。有任何想法嗎?

我還應該提到,我在一些運行Django模型管理命令的代碼中運行這個代碼。換句話說,在我的模型/管理/命令文件夾中,我有一個python文件(比如do_stuff.py),我用./manage.py do_stuff執行它。所以這些都是從命令行運行的,也就是說沒有涉及瀏覽器,沒有模板等。只是一個自定義的Djanago命令。

回答

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') 
੉老지킣洭揑縹 
+0

問題是我甚至無法獲取數據解碼。它在我執行Django查詢後立即引發異常。 – Marc

0

嗯,事實證明,我被加密的數據項有一個字段。它看起來像編碼有一些問題 - 也許數據庫的默認編碼不是utf8。無論如何,我只需清空這個領域就能避免這個問題,因爲我不需要它。不是最令人滿意的解決方案,但至少它讓我繼續前進。我懷疑最好的解決方案的確是確保數據庫被格式化爲默認使用UTF8,然後再放入任何內容。