2014-04-06 135 views
1

我對今天發現的一個問題感到十分困惑:我有一個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_filenameTextField),它是正確返回的,如同一個Unicode字符串

我有沒有特殊選項,數據庫數據編碼正確,我甚至不知道從哪裏開始尋找解決方案。這是Django 1.6.2。

更新:

數據庫服務器編碼是UTF8,像往常一樣,並且該數據被正確地編碼。這是在Ubuntu上的PostgreSQL 9.1上。

更新2:

我想我可能已經找到了原因,但我不知道爲什麼它的行爲是這樣的:我認爲數據庫中的字段都與text類型定義,像往常一樣,而是他們定義爲citexthttp://www.postgresql.org/docs/9.1/static/citext.html)。由於Django模型是非託管的,它看起來像Django不會將字段類型解釋爲值得轉換爲Unicode。任何想法如何強制Django做到這一點?

+0

從'psql'連接到同一個數據庫的'SHOW server_encoding;'的輸出是什麼?什麼是您的PostgreSQL版本? –

+0

server_encoding是UTF8,PostgreSQL是9.1。但是...請參閱我在citext上的編輯。 –

回答

0

顯然,Django不會將citext類型的字段視爲文本,並將它們作爲Unicode字符串返回。

相關問題