Аккаунт PostgreSQL + регистр без учета регистра

Я ищу способ поддержки с хорошими характеристиками без учета регистра или без акцента. До сих пор у нас не было никаких проблем с использованием сервера MSSql, в Oracle нам пришлось использовать OracleText, и теперь нам это нужно на PostgreSQL.

Я нашел этот пост о нечувствительности к акценту:
Поддерживает ли PostgreSQL "нечувствительность к акценту" сопоставления?

Но нам нужно объединить его с case insensitve. Нам также нужно использовать индексы, иначе производительность может быть затронута. Любой реальный опыт в отношении наилучшего подхода для больших баз данных?

Ответ 1

Если вам нужно "комбинировать с регистрозависимым", в зависимости от ваших конкретных требований существует ряд опций.

Может быть, простейший, сделать регистр индекса нечувствительным.

Основываясь на функции f_unaccent(), изложенной в ответе с ссылкой:

CREATE INDEX users_lower_unaccent_name_idx ON users(lower(f_unaccent(name)));

Тогда:

SELECT *
FROM   users
WHERE  lower(f_unaccent(name)) = lower(f_unaccent('João'));

Или вы можете построить lower() в функции f_unaccent(), чтобы получить что-то вроде f_lower_unaccent().

Или (особенно если вам нужно выполнить нечеткое сопоставление шаблонов в любом случае), вы можете использовать индекс триграммы, предоставляемый дополнительным модулем pg_trgm, используя вышеприведенную функцию, которая также поддерживает ILIKE. Подробности:

Я добавил примечание к ответу.

Или вы можете использовать дополнительный модуль citext: