2013-08-29 4 views
1

У меня есть стандартный сервер postgresql из нового и старого репозитория ubuntu.Функция lower() для международных символов в postgresql

Первый - сервер postgresql 8.3.12. Здесь функция ниже() корректно работает на датском букву «æ»

go=# select lower('Æ'); 
lower 
------- 
æ 
(1 row) 

Теперь на Postgres 9.1.9 функция не работает (она возвращает ту же букву в верхнем регистре)

go=# select lower('Æ'); 
lower 
------- 
Æ 
(1 row) 

ли у кого есть идея, как изменить это поведение?

(моя реальная проблема заключается в том, что ILIKE не работает на датских символов либо, но я думал, что приведенный выше пример будет сделать проблему более ясно)

+0

Вы уверены, что ничего не пропустили, он работает на sqlfiddle - http://sqlfiddle.com/#!1/d41d8/1253, версия 9.1.9? –

ответ

4

Ваша база данных была создана, вероятно, с другой местности.

Проверьте \l+ в psql на старых и новых версиях. У них будут разные настройки языка.

Другие возможности - разные операционные системы/версии. PostgreSQL использует правила локали libc, а некоторые платформы (в частности, Mac OS X) имеют немного ... special ... libc.

На 9.1.9 с базой данных en_AU.UTF-8 работает на Fedora 19, я получаю:

regress=> select lower('Æ'); 
lower 
------- 
æ 
(1 row) 
+0

Да, это была локаль. В результате я изменил переменную среды LANG с en_DK.UTF-8 на da_DK.UTF-8. Удаление postgresql, установка его снова и восстановление дампа из postgresql 8.3. Это заставило его работать правильно. – user2728690

1

Проблема оказалась в том, что кластер PostgreSQL был создан с помощью системы (Ubuntu 12.04) после установки, и было взятый C как lc_ctype, и ASCII в качестве кодировки вместо наследования из локали, который был en_DK.UTF8. После выполнения pg_dropcluster и pg_createcluster был использован правильный язык и кодировка, и все начало работать правильно.

+0

Если вы имеете в виду 'SQL_ASCII', это чистое зло. Будь рад, что ты поймал это и исправил его. –