Кто-нибудь имел успех, используя конкретную локаль для базы данных PostgreSQL, так что сравнение текста без учета регистра? - PullRequest
5 голосов
/ 18 декабря 2009

Я разрабатываю приложение в Rails для OS X с использованием PostgreSQL 8.4. Мне нужно настроить базу данных для приложения, чтобы стандартные текстовые запросы не чувствительны к регистру. Например:

ВЫБРАТЬ * ИЗ Документов, ГДЕ title = 'невероятный документ'

должен возвращать тот же результат, что и:

ВЫБРАТЬ * ИЗ документов, ГДЕ title = 'Невероятный документ'

Просто чтобы прояснить, я не хочу использовать:

(1) LIKE в предложении where или любом другом типе специальных операторов сравнения

(2) citext для типа данных столбца или любого другого специального индекса столбца

(3) любой тип полнотекстового программного обеспечения, такого как Sphinx

Что мне нужно, так это настроить язык базы данных для поддержки сравнения текста без учета регистра. Я нахожусь на Mac OS X (10.5 Leopard) и уже пытался установить кодировку на "LATIN1", с Collation и Ctype, оба на "en_US.ISO8859-1" Пока безуспешно.

Любая помощь или предложения приветствуются.

Спасибо!

Обновление

Я отметил один из приведенных ответов как правильный ответ из уважения к ответившим людям. Однако я решил решить эту проблему не так, как предполагалось. После дальнейшего рассмотрения приложения, есть только несколько случаев, когда мне нужно сравнение без учета регистра с полями базы данных, поэтому я буду создавать shadow поля базы данных для тех, которые мне нужно сравнивать без учета регистра , Например, name и name_lower. Я полагаю, что где-то встречал это решение в сети. Надеемся, что PostgreSQL позволит использовать параметры сопоставления, аналогичные тем, что SQL Server предоставляет в будущем (например, DOCI).

Отдельное спасибо всем, кто откликнулся.

Ответы [ 5 ]

1 голос
/ 06 января 2010

Со всеми установленными вами ограничениями, возможно, единственный способ заставить его работать, это определить свой собственный оператор = для текста. Весьма вероятно, что это создаст другие проблемы, такие как создание неработающих индексов. Кроме этого, вам лучше всего использовать тип данных citext; это все равно позволило бы используемому вами ORM-материалу генерировать SQL.

(Я не упоминаю о возможности создания вашего собственного определения локали, потому что я никогда не слышал, чтобы кто-то делал это.)

1 голос
/ 18 декабря 2009

Вам, вероятно, потребуется сделать что-то вроде использования функции столбца для преобразования вашего текста, например. преобразовать в верхний регистр - пример:

SELECT * FROM documents WHERE upper(title) = upper('incredible document')

Обратите внимание, что это может привести к снижению производительности при использовании сканирования индекса, но если это станет проблемой, вы можете определить индекс, включающий функции столбцов для целевых столбцов, например,

CREATE INDEX I1 on documents (upper(title))
0 голосов
/ 21 октября 2010
SELECT * FROM documents WHERE title ~* 'incredible document'
0 голосов
/ 18 декабря 2009

Я не думаю, что для этого используется локальная или кодировка. Кодировка больше подходит для выбора набора символов, а не для определения того, как обращаться с символами. Если бы была настройка, она была бы в конфиге, но я ее не видел.

Если вы не хотите использовать ilike из-за страха невозможности портировать на другую базу данных, я бы посоветовал вам посмотреть, какие опции ORM могут быть доступны с ActiveRecord, если вы используете это.

Вот что-то от одного из лучших сотрудников Postgres: http://archives.postgresql.org/pgsql-php/2003-05/msg00045.php

edit: исправлены конкретные ссылки на локаль.

0 голосов
/ 18 декабря 2009

Ваша проблема и ваши эксклюзивы - все равно что сказать: «Я хочу плавать, но я не хочу двигать руками».

Ты утонешь, пытаясь.

...