Python/Django将u''字符串写入Postgresql(使用UTF8 DB)和Munges条目

Python/Django将u''字符串写入Postgresql(使用UTF8 DB)和Munges条目,python,django,postgresql,unicode,Python,Django,Postgresql,Unicode,我肯定我对这里的某些东西有误解,但我看不出它是什么 在Django中,我有一个模型字段,它表示: short_url_slug = AutoSlugField(slugify=short_url_slugify, populate_from=id, blank=False, unique=True) 南方似乎正确地创建了迁移: 'short_url_slug': ('autoslug.fields.AutoSlugField', [], {'unique_with': '()', 'max_l

我肯定我对这里的某些东西有误解,但我看不出它是什么

在Django中,我有一个模型字段,它表示:

short_url_slug = AutoSlugField(slugify=short_url_slugify, populate_from=id, blank=False, unique=True)
南方似乎正确地创建了迁移:

'short_url_slug': ('autoslug.fields.AutoSlugField', [], {'unique_with': '()', 'max_length': '50', 'populate_from': 'None', 'blank': 'True'}),
我的Postgresql数据库是UTF8:

\l

(MyDBName)                      | (username) | UTF8     | en_US.UTF-8 | en_US.UTF-8 | 
我有一个真实的unicode字符:

u'\xa4'
但当我将其写入数据库并尝试读出时,我得到:

In [3]: this_instance.short_url_slug
Out[3]: u'o'
想法?我的怀疑是Postgresql需要一种不同的字符编码,但我不确定它应该是什么,或者如何做到

用附加信息编辑

Python版本:

Python 2.7.2 (default, Oct 11 2012, 20:14:37)
Django版本:

In [2]: django.VERSION
Out[2]: (1, 5, 1, 'final', 0)
psycopg2:

$ pip freeze | grep psycopg2
psycopg2==2.5
来自postgresql的原始日志:

LOG:  statement: UPDATE [...lots of stuff removed...] "short_url_slug" = 'o' [... rest of the stuff ...]
所以,看起来它甚至还没有到达Postgresql。但是当我在插入中的行中断时,变量肯定具有unicode值

(Pdb) response.short_url_slug
u'\xd6'
这是在Python中的赋值之后,但在response.save之前

更多输出:

我检测到unicode被屏蔽的方式是违反了数据库唯一性约束。这可以在将此内容输出到模型中并禁用约束时进行测试:

In [11]: all = Response.objects.all()

In [12]: all[0].short_url_slug
Out[12]: u'o'

In [13]: all[4].short_url_slug
Out[13]: u'o'

In [14]: all[4].short_url_slug == all[0].short_url_slug
Out[14]: True

Django slugify不支持unicode,您应该使用


如Django的两个勺子中所述,请显示以下附加详细信息:查询选择版本的输出,当前设置“标准一致字符串”为scs;,以及您的Python、Django和psycopg2或您正在使用的任何DB适配器版本。在postgresql.conf中打开log_statement='all',重新加载postgresql,并检查日志以识别postgresql看到的可疑插入的文本,这也会非常有帮助。U+00A4货币符号与U+00D4拉丁文大写字母O和扬抑符完全不同,对于哪个o是绝对有效的段塞。是否安装了unidecode?pytils呢?很有趣。。。但是当我尝试添加列时,我在列上得到了一个独特的约束冲突。有趣的是——但我使用的是AutoSlug和一个自定义Slugifier——这不应该绕过Django的默认值吗?您的自定义Slugifier是什么?默认情况下,它是django的一个,但没有安装pyutils或unicode。这让我想到了模块的normalyze方法。但是我不能用默认的4个表单复制你的结果…在s中,如果没有安装unidecode或pyutils,那么就使用defaut django引擎。你能试着用éu'\xe9'看看它是否被翻译成e吗?我实际上使用了另一种解决方案,所以我无法测试这个:,但我肯定在文档中遗漏了这一点,几乎可以肯定这是原因!
In [11]: all = Response.objects.all()

In [12]: all[0].short_url_slug
Out[12]: u'o'

In [13]: all[4].short_url_slug
Out[13]: u'o'

In [14]: all[4].short_url_slug == all[0].short_url_slug
Out[14]: True