我有一个名为联系人
的表格 id | name
----+------------------
44 | Aarón
我正在尝试执行查询:
select id,name from contacts where name ilike 'Aaro%';
返回(0 rows)
我正在尝试搜索“ o ”,并且期望结果包括“ o ”的所有重音,例如“ó”。 正如我已经做了一些谷歌搜索和stackoverlfowing我发现使用区域设置我需要安装排序规则。 所以我通过
在linux中安装了排序规则sudo locale-gen --no-archive de_DE.utf-8
之后我尝试在postgresql数据库中安装排序规则。
create collation de (LOCALE='de_DE.utf-8');
校对生成成功。我试图通过使用select * from pg_collation列出这个排序规则;它就在那里。
完成所有这些后,我再次尝试通过查询得到所有相对重音“o”的结果:
select id,name from contacts where name ilike 'Aaro%';
但我又得到了(0 rows)
当我执行上述查询时,我想要记录“Aarón”。
先谢谢。
答案 0 :(得分:3)
您可以使用postgres的unaccent模块。
为此你需要在你的系统中安装postgresql-contrib。你可以在debian linux中使用下面的命令安装它。
sudo apt-get install postgresql-contrib
之后你可以在postgres中创建unaccent。
postgres_db=# create EXTENSION unaccent;
CREATE EXTENSION
postgres_db=# select name from test where unaccent(name) ilike 'Aaro%';
name
-------
Aarón
(1 row)
希望这有帮助!
答案 1 :(得分:1)
扩展程序unaccent是一个很好的解决方案。如果你处理一小部分没有连字的字符,你可以使用像这样的简单函数进行波兰语:
create or replace function unaccent_pl(text)
returns text language sql immutable as $$
select translate($1, 'ąćęłńóśźżĄĆĘŁŃÓŚŹŻ', 'acelnoszzACELNOSZZ')
$$;
select unaccent_pl('Zażółć gęślą jaźń');
unaccent_pl
-------------------
Zazolc gesla jazn
(1 row)