我有一个类似于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%'"
查询仍然没有产生任何结果。我很难过。
答案 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服务检索数据的时间。它可能是:
我会先从第二种可能性开始研究这两点。
答案 2 :(得分:0)
将postgres表的字符编码设置为utf-8,然后它将与python顺利集成。无需来回转换。您的问题看起来像是在为您的python代码和数据库使用两种不同的编码。
编辑:Almod \ u00f3var看起来像Windows代码页1252。