使用Python在Postgres中搜索json编码的字符串

时间:2013-08-11 20:05:31

标签: python json postgresql encoding

我有一个类似于db的查询,我在Postgres数据库中用Python执行:

"Select * from my_tbl where big_string like '%Almodóvar%'"

但是,我在Almodóvar上搜索的列中表示为“Almod\u00f3var”,因此查询不返回任何内容。

我可以做些什么来使两个字符串匹配?宁愿在Python端使用Almodóvar而不是数据库中的列,但我很灵活。

评论提示的其他信息:

数据库使用UTF-8。我正在查询的字段是从外部API获取的。数据以json的形式RESTful检索,然后在json.dump之后插入到数据库的文本字段中。

因为数据包含许多外来名称和字符,所以使用它是一系列与编码相关的麻烦。如果有一个银色的子弹让这个数据与Python很好玩,我将非常感谢知道这是什么。

更新2:

看起来它的json编码造成了我的困惑。

print json.dumps("Almodóvar")

产量

"Almod\u00f3var"

这是我在查看原始数据时看到的内容。但是,当我使用json.dumps来构造它时:

"Select * from my_tbl where big_string like '%Almod\u00f3var%'"

查询仍然没有产生任何结果。我很难过。

3 个答案:

答案 0 :(得分:2)

来自help(json.dumps):

If ``ensure_ascii`` is false, all non-ASCII characters are not escaped, and
the return value may be a ``unicode`` instance. See ``dump`` for details.

来自help(json.loads):

If ``s`` is a ``str`` instance and is encoded with an ASCII based encoding
other than utf-8 (e.g. latin-1) then an appropriate ``encoding`` name
must be specified. Encodings that are not ASCII based (such as UCS-2)
are not allowed and should be decoded to ``unicode`` first.

所以尝试像

这样的东西
>>> js = json.dumps("Almodóvar", ensure_ascii=False)  
>>> res = json.loads(js, encoding="utf-8")
>>> print res
Almodóvar

答案 1 :(得分:1)

您的问题似乎是在查询之前的一步。从您从Web服务检索数据的时间。它可能是:

  • 在与Web服务通信期间,编码未设置为UTF-8。
  • tmdb.org端的编码不是UTF-8(我不确定)。

我会先从第二种可能性开始研究这两点。

答案 2 :(得分:0)

将postgres表的字符编码设置为utf-8,然后它将与python顺利集成。无需来回转换。您的问题看起来像是在为您的python代码和数据库使用两种不同的编码。

编辑:Almod \ u00f3var看起来像Windows代码页1252。