Как использовать регистронезависимое сопоставление с PostgreSQL и Umlauts? - PullRequest
1 голос
/ 23 июня 2010

Я пытаюсь заставить PostgreSQL 8.4.3 выполнить сопоставление шаблона без учета регистра с его оператором ~*, когда строки содержат не-ASCII символы, такие как немецкие умляуты.База данных, терминал и все остальное настроено на использование UTF-8.

Вот в двух словах проблема:

SELECT 'Ö' ~* 'ö';      -- false

Существуют другие варианты, которые работают:

SELECT 'Ö' ILIKE 'ö';     -- true
SELECT 'Ö' ~* '[Öö]';     -- true
SELECT LOWER('Ö') ~* 'ö'; -- true

Ни одна из этих альтернатив не делает меня особенно счастливым.ILIKE не использует регулярные выражения.[Öö] включает переписывание поискового запроса.LOWER (), вероятно, лучший обходной путь, но мне бы очень хотелось, чтобы оператор ~* работал так, как он должен.

Заранее спасибо.

Ответы [ 2 ]

3 голосов
/ 24 июня 2010

Это ошибка в версиях PostgreSQL до 9.0.
В журнале изменений 9.0: http://www.postgresql.org/docs/9.0/static/release-9-0.html#AEN99075

Вот мой тест в 9.0 beta2 с использованием Ubuntu:

SELECT 'Ö' ~* 'ö';
 ?column? 
----------
 t
(1 row)
1 голос
/ 23 июня 2010

Я получаю правду с этим запросом:

SELECT 'Ö' ~* 'ö'; -- true

Но я использовал версию 9.0beta2 в OS X 10.5.8 со следующими настройками:

CREATE DATABASE test
  WITH OWNER = postgres
       ENCODING = 'UTF8'
       TABLESPACE = pg_default
       LC_COLLATE = 'nl_NL.UTF-8'
       LC_CTYPE = 'nl_NL.UTF-8'
       CONNECTION LIMIT = -1;

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

...