我對今天發現的一個問題感到十分困惑:我有一個PostgreSQL數據庫,這些數據庫中沒有Django管理的表,以及通過QuerySet在這些表上完全正常的查詢。但是,我開始獲取Unicode異常,並且當我開始挖掘時,發現我的QuerySets正在返回非Unicode字符串!Django查詢返回非Unicode字符串?
示例代碼:
d = Document.objects.get(id=45787)
print repr(d.title), type(d.title)
以上聲明的輸出是一個普通的字符串(不u
前綴),接着是<str>
類型標識符。更重要的是,這個正常的字符串包含UTF-8數據,如原始字節形式!如果我撥打d.title.decode('utf-8')
,我會得到有效的Unicode字符串!
更令人費解,一些的字段正常工作。同樣的表格/模型包含另一個字段html_filename
(TextField
),它是正確返回的,如同一個Unicode字符串!
我有沒有特殊選項,數據庫數據編碼正確,我甚至不知道從哪裏開始尋找解決方案。這是Django 1.6.2。
更新:
數據庫服務器編碼是UTF8,像往常一樣,並且該數據被正確地編碼。這是在Ubuntu上的PostgreSQL 9.1上。
更新2:
我想我可能已經找到了原因,但我不知道爲什麼它的行爲是這樣的:我認爲數據庫中的字段都與text
類型定義,像往常一樣,而是他們定義爲citext
(http://www.postgresql.org/docs/9.1/static/citext.html)。由於Django模型是非託管的,它看起來像Django不會將字段類型解釋爲值得轉換爲Unicode。任何想法如何強制Django做到這一點?
從'psql'連接到同一個數據庫的'SHOW server_encoding;'的輸出是什麼?什麼是您的PostgreSQL版本? –
server_encoding是UTF8,PostgreSQL是9.1。但是...請參閱我在citext上的編輯。 –