Как заставить мою базу данных postgresql использовать регистр без учета регистра?

В нескольких сообщениях SO OP запросил эффективный способ поиска текстовых столбцов нечувствительным к регистру образом.

Насколько я понял, наиболее эффективным способом является наличие базы данных с нечувствительной к регистру сортировкой. В моем случае я создаю базу данных с нуля, поэтому у меня есть идеальный контроль над сортировкой БД. Единственная проблема заключается в том, что я понятия не имею, как определить ее и не смог найти ее.

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

Я использую postgresql 9.2.4.

РЕДАКТИРОВАТЬ 1

Расширение CITEXT является хорошим решением. Тем не менее, он имеет некоторые ограничения, как описано в документации. Я, конечно, буду использовать его, если не будет лучшего способа.

Я хотел бы подчеркнуть, что я хочу, чтобы ВСЕ операции с строкой были нечувствительны к регистру. Использование CITEXT для каждого поля TEXT является одним из способов. Однако использование нечувствительного к регистру сопоставления было бы лучшим, если это вообще возможно.

Теперь https://stackoverflow.com/users/562459/mike-sherrill-catcall говорит, что PostgreSQL использует любые сопоставления, предоставляемые базовой системой. Я не возражаю против того, чтобы ОС отображала нечувствительность к регистру. Единственная проблема, о которой я не знаю, как это сделать.

Ответы

Ответ 2

Для моей цели ключевое слово ILIKE выполнило эту работу.

Из postgres docs:

Ключевое слово ILIKE можно использовать вместо LIKE, чтобы сделать совпадение без учета регистра в соответствии с активной локалью. Это не в SQL, но является расширением PostgreSQL.

Ответ 3

Это не изменение сортировки, но, возможно, кто-то поможет в этом типе запроса, где я использовал функцию lower:

SELECT id, full_name, email FROM nurses WHERE(lower(full_name) LIKE '%bar%' OR lower(email) LIKE '%bar%')

Ответ 4

Я считаю, что при создании кластера базы данных вам нужно указать свой вариант сопоставления как параметр командной строки initdb. Что-то вроде

initdb --lc-collate=en_US.UTF-8 

Также кажется, что использование PostgreSQL 9.3 на Ubuntu и Mac OS X, initdb автоматически создает кластер базы данных с использованием несовместимой по регистру сортировки, которая по умолчанию используется в текущей локали ОС, в моем случае en_US.UTF-8.

Можете ли вы использовать более старую версию PostgreSQL, которая не по умолчанию не соответствует языку хоста? Или может быть, что вы работаете в операционной системе, которая не обеспечивает каких-либо нечувствительных к регистру сортировок для PostgreSQL?