Ответ 1
Нет никаких регистрозависимых коллайсов, но есть расширение citext:
В нескольких сообщениях SO OP запросил эффективный способ поиска текстовых столбцов нечувствительным к регистру образом.
Насколько я понял, наиболее эффективным способом является наличие базы данных с нечувствительной к регистру сортировкой. В моем случае я создаю базу данных с нуля, поэтому у меня есть идеальный контроль над сортировкой БД. Единственная проблема заключается в том, что я понятия не имею, как определить ее и не смог найти ее.
Пожалуйста, покажите мне, как создать базу данных с нечувствительной к регистру сортировкой.
Я использую postgresql 9.2.4.
РЕДАКТИРОВАТЬ 1
Расширение CITEXT
является хорошим решением. Тем не менее, он имеет некоторые ограничения, как описано в документации. Я, конечно, буду использовать его, если не будет лучшего способа.
Я хотел бы подчеркнуть, что я хочу, чтобы ВСЕ операции с строкой были нечувствительны к регистру. Использование CITEXT
для каждого поля TEXT
является одним из способов. Однако использование нечувствительного к регистру сопоставления было бы лучшим, если это вообще возможно.
Теперь https://stackoverflow.com/users/562459/mike-sherrill-catcall говорит, что PostgreSQL использует любые сопоставления, предоставляемые базовой системой. Я не возражаю против того, чтобы ОС отображала нечувствительность к регистру. Единственная проблема, о которой я не знаю, как это сделать.
Нет никаких регистрозависимых коллайсов, но есть расширение citext:
Для моей цели ключевое слово ILIKE выполнило эту работу.
Из postgres docs:
Ключевое слово ILIKE можно использовать вместо LIKE, чтобы сделать совпадение без учета регистра в соответствии с активной локалью. Это не в SQL, но является расширением PostgreSQL.
Это не изменение сортировки, но, возможно, кто-то поможет в этом типе запроса, где я использовал функцию lower
:
SELECT id, full_name, email FROM nurses WHERE(lower(full_name) LIKE '%bar%' OR lower(email) LIKE '%bar%')
Я считаю, что при создании кластера базы данных вам нужно указать свой вариант сопоставления как параметр командной строки initdb
. Что-то вроде
initdb --lc-collate=en_US.UTF-8
Также кажется, что использование PostgreSQL 9.3 на Ubuntu и Mac OS X, initdb
автоматически создает кластер базы данных с использованием несовместимой по регистру сортировки, которая по умолчанию используется в текущей локали ОС, в моем случае en_US.UTF-8
.
Можете ли вы использовать более старую версию PostgreSQL, которая не по умолчанию не соответствует языку хоста? Или может быть, что вы работаете в операционной системе, которая не обеспечивает каких-либо нечувствительных к регистру сортировок для PostgreSQL?