2014-04-06 106 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字符串返回。

相关问题