【问题标题】:Django: unicode string gets written to database as non-unicodeDjango:unicode字符串作为非unicode写入数据库
【发布时间】:2012-12-04 23:25:44
【问题描述】:

我编写了一个基本脚本,可以将数千个值导入 Django 数据库。它的外观如下:link

这些位置以西里尔字母表示,并表示为 unicode 文字。但是,一旦我将它们保存到数据库中,它们就会以某种十六进制编码形式转换为看似编码的简单字符串:

>>> Region.objects.all()[0].parent
'\xd0\xbe\xd0\xb1\xd0\xbb\xd0\xb0\xd1\x81\xd1\x82 \xd0\xa1\xd0\xbb\xd0\xb8\xd0\xb2\xd0\xb5\xd0\xbd'

令人惊讶的是,它们在管理面板中正确显示,但我在尝试使用它们时遇到了麻烦。如何以 unicode 形式存储和检索它们?

我在 MySQL 上运行 Django 1.4.0,排序规则设置为 utf8_bin。

【问题讨论】:

  • 我不确定是否可以在控制台上实际打印 unicode。关于您的数据库,请检查您的数据库的默认编码,并确保它是 UTF-8。例如。 MySQL 通常有一些其他的基于 ascii 的编码。
  • @JosvicZammit 为清楚起见进行了编辑。我什至可以很好地打印原始数据,但不能打印保存的字段值。
  • 我认为是因为 utf8_bin。它将 unicode 数据存储为二进制表示。尝试将排序规则设置为 utf8_general_csutf8_general_ci

标签: python django


【解决方案1】:

这是 Django/MySQL 的“错误”。请参阅问题#16052。其实是documented here

【讨论】:

  • 将数据库范围的排序规则更改为 utf8_general_ci 似乎做同样的事情。
【解决方案2】:

看起来数据是作为 UTF-8 字节字符串而不是 Unicode 字符串返回的。尝试解码:

>>> x='\xd0\xbe\xd0\xb1\xd0\xbb\xd0\xb0\xd1\x81\xd1\x82 \xd0\xa1\xd0\xbb\xd0\xb8\xd0\xb2\xd0\xb5\xd0\xbd'
>>> x.decode('utf-8')
u'\u043e\u0431\u043b\u0430\u0441\u0442 \u0421\u043b\u0438\u0432\u0435\u043d'
>>> print x.decode('utf-8')
област Сливен

【讨论】:

  • 这似乎暂时有效;我不知道这是 UTF-8。我会看看它是否能解决我的问题 - 谢谢!
猜你喜欢
  • 1970-01-01
  • 2012-07-18
  • 2018-09-07
  • 2019-09-04
  • 1970-01-01
  • 2011-05-17
  • 1970-01-01
  • 2014-07-31
  • 2015-06-03
相关资源
最近更新 更多