2016-12-14 13 views
1

У меня есть таблица с именем контактовКак найти все относительные акценты в вопросе выбора Postgresql?

id |  name  
----+------------------ 
44 | Aarón 

Я пытаюсь выполнить запрос:

select id,name from contacts where name ilike 'Aaro%'; 

Он вернется (0 rows)

Я пытаюсь искать 'о' и также ожидается, что результат будет включать все акценты 'o' like '- '. Как я уже делал некоторые поисковые запросы, я нашел, что с помощью locale мне нужно установить сортировку. Так я установил параметры сортировки в Linux с помощью

sudo locale-gen --no-archive de_DE.utf-8 

после этого я попытался установить параметры сортировки в базе данных PostgreSQL.

create collation de (LOCALE='de_DE.utf-8'); 

сортировка сгенерирована успешно. Я попытался перечислить эту сортировку, используя select * from pg_collation; и он есть.

после выполнения всего этого я снова попытался получить результат всех относительных ACCENT «O» по запросу:

select id,name from contacts where name ilike 'Aaro%'; 

но опять же я получил (0 rows)

Ultimatly Я хочу, чтобы запись «Aarón», когда я выполнить запрос выше.

Спасибо заранее.

+0

http://dba.stackexchange.com/questions/124695/postgresql-translate-special- символов или вы можете определить самостоятельно. –

+0

Сводка не будет изменять проверки на равенство и такие (например, 'LIKE',' ILIKE', '~' и т. Д.), Но вместо этого вы можете заказывать свои данные с помощью другого набора правил (на некоторых языках существуют строгие правила для упорядочения акцентированных символов) , В PostgreSQL типичным решением для вашей проблемы является 'unaccent()' (см. Ответы). – pozs

ответ

3

Вы можете использовать модуль postgres unaccent.

Для этого вам необходимо установить postgresql-contrib в свою систему. вы можете установить его с помощью команды внизу в debian based linux.

sudo apt-get install postgresql-contrib 

после этого вы можете создать unaccent в postgres.

postgres_db=# create EXTENSION unaccent; 
CREATE EXTENSION 
postgres_db=# select name from test where unaccent(name) ilike 'Aaro%'; 
name 
------- 
Aarón 
(1 row) 

Надеюсь, это поможет!

+0

Awesome !!, Thanks Atul, сейчас он работает. –

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) 
+0

'translate()' может быть хорошей альтернативой, но люди обычно забывают о [unicode combining marks] (https://en.wikipedia.org/wiki/Combining_character), когда они его используют.И, нет, к сожалению [PostgreSQL не нормализует unicode] (http://stackoverflow.com/questions/24863716/unicode-normalization-in-postgres) (пока). – pozs

+0

Как упоминалось выше, 'translate()' имеет ограниченное использование. Нормализация Юникода не является проблемой, если данные поступают из хорошо написанных клиентских приложений. – klin