2013-09-14 3 views
17

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

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

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

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

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

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

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

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

+2

PostgreSQL использует любые параметры сортировки базовая операционная система предоставляет. Системная таблица «pg_collation» заполняется initdb. Используйте 'select * from pg_collation;', чтобы увидеть, какие коллизии найдены. –

+0

Это не отвечает на мой вопрос. – mark

+2

Вы можете попытаться использовать ['this'] (http://www.postgresql.org/docs/current/static/citext.html) Расширение Postgres –

ответ

-2

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

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

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

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

+0

Я использую PostgreSQL 9.3 для Windows 7 и 8. Я понятия не имею, обеспечить нечувствительность к регистру для PostgreSQL. Я знаю, что SQL Server может быть настроен с такой сортировкой. – mark

+0

Я не могу помочь с Windows ... но похоже, что это место для начала. Узнайте, какие нечувствительные к регистру сопоставления Windows предоставляют, и посмотрите, можете ли вы указать PostgreSQL на использование одного из них при создании кластера. – glyphobet

+0

Из моих экспериментов с PostgreSQL 9.6 параметр -lc-collate = en_US.UTF-8 не создает сортировку без учета регистра. –

4

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

От postgres docs:

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

+2

Если вы не избежите шаблона, это приведет к неправильным результатам для строк, содержащих '_' или'% ', если вы попытаетесь использовать его как' = '. –

0

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

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

Смежные вопросы