barbitoff programmer`s blog

Здесь я публикую заметки из программерской жизни: грабли, на которые мне случилось наступить, проблемы, для которых было найдено элегантное (или не очень) решение, а также все, с чем мне пришлось столкнуться и чем хотелось бы поделиться =)
PS Если хотите меня поблагодарить - на странице есть 3 места, чтобы это сделать =)

пятница, 8 июня 2012 г.

PostgreSQL и upper() / lower() русских букв

Проблема:

В PostgreSQL функции upper() и lower() не работают для русских букв (буквы остаются в том же регистре, в каком и были). Кодировка БД - 'UTF-8'.

Решение:

Чтобы корректно работали функции upper() / lower() для русских букв (а также, например, регистронезависимые регулярные выражения), нужно корректно задать collation и character classification при создании базы (а не только кодировку) параметрами LC_COLLATE и LC_CTYPE команды CREATE DATABASE, установив их в 'ru_RU.UTF-8'. Вот только введены эти параметры были только в 8.4, а в моем случае версия сервера - 8.3, где эти параметры конфигурируются единожды, при инициализации PostgreSQL-кластера (командой initdb). Сомневаюсь, что получится это обойти, поэтому остается только дампануть все базы, переинициализировать кластер, и восстановиться из дампа. Ну или обновить версию сервера ;)

PS Посмотреть текущие настройки collation`а можно запросом:
select * from pg_settings where name like 'lc_%'
Однако запросом:
SET lc_collate to 'ru_RU.UTF-8';
ничего поправить не удастся:
ERROR:  parameter "lc_collate" cannot be changed

Комментариев нет:

Отправить комментарий