Проблема с русской локалью в PostgreSQL 8.3.1 на FreeBSD 4.9.
Не работают строковые функции lower/upper и tsearch2. Кодировка базы UTF8. Кластер инициализировал с опциями --encoding=UTF8 --locale=ru_RU.UTF-8.
wiki_site=> SELECT page_title, lower(page_title) FROM page WHERE page_id = 43; page_title | lower ------------+------- Планы | (1 row) wiki_site=> SELECT page_title, upper(page_title) FROM page WHERE page_id = 43; page_title | upper ------------+------- Планы | Планы (1 row) wiki_site=> SELECT page_title, to_tsvector(page_title) FROM page WHERE page_id = 43; page_title | to_tsvector ------------+------------- Планы | '\x01 (1 row) wiki_site=> \l List of databases Name | Owner | Encoding --------------+---------+---------- phpbb | ybotany | UTF8 postgres | pgsql | UTF8 template0 | pgsql | UTF8 template1 | pgsql | UTF8 wiki_project | ybotany | UTF8 wiki_site | ybotany | UTF8 (6 rows)
Подскажите в чём может быть дело.
Приведите,
Приведите, стурктуры таблиц, с которыми выполняете запросы.
У меня PostgreSQL 8.2 на Linux, lower и upper отрабатывают без проблем. А есть ли нормальная поддержка UTF-8 в самой операционной системе FreeBSD? Например что показывает команда:
-----------------------------------------------------------------------------------
"ls /" (C) Козьма Прутков
Это известно,
Это известно, что в линуксе всё хорошо.
locale -a |grep -i utf8
Не посмотреть потому что во FreeBSD 4.9 утилиты locale просто нет. Но локаль ru_RU.UTF-8 в /usr/share/locale присутствует. А что может зависеть от структуры таблицы?
Тогда копайте в
Тогда копайте в сторону поддержки ru_RU.UTF-8 в FreeBSD. PostgreSQL использует системную локаль для выполнения преобразований строк в верхний и нижний регистр. Попробуйте для примера взять Perl и попробовать там - думаю результат будет такой же.
Что касается структуры таблиц - была когда-то такая фигня в PostgreSQL младших версий, что вроде как на CHAR работало а то ли на VARCHAR то ли на TEXT нет. Но помоему это уже исправили давным давно - хотя можете поробовать - чем чёрт не шутит.
Мне всё-таки кажется, что проблема в том, что в системе нет нормальной локали ru_RU.UTF-8. Проверьте на Perl.
-----------------------------------------------------------------------------------
"ls /" (C) Козьма Прутков
Не силён в
Не силён в перле. Попробовал так:
Работает. Выводит ТЕКСТ ТЕКСТ TEXT
Но думаю это не зависит от локали.
А вот так не работает даже в линуксе:
У меня хотя и с
У меня хотя и с warning'ами но работает:
ТЕКСТ
текст
-----------------------------------------------------------------------------------
"ls /" (C) Козьма Прутков
Для того что бы
Для того что бы проверить локаль я думаю нужно что то вроде этого.
А с
USE utf8
видимо локаль не используется.Локаль
Локаль используется текущая! У меня стоит как раз ru_RU.UTF-8.
Вызов setlocale делать по моему глубокому убеждению в данном случае бессмыслено, потому как этот вызов делается в самом Perl на уровне языка C, на котором он и скомпилен.
Ещё одним способом проверки в самом PostgreSQL может послужить попытка сортировки - отсортирует ли по алфавиту? Впрочем у меня всё-таки уверенность на 99% - просто в системе нет корректной поддержки локали ru_RU.UTF-8. Поэтому для вас самым лучшим выходом будет работать с KOI8-R.
-----------------------------------------------------------------------------------
"ls /" (C) Козьма Прутков
может postgresql
может postgresql криво собран?
у меня на pg 8.3 под freebsd 7 все отлично работает.
У меня сильное
У меня сильное подозрение, что речь шла о FreeBSD 6.3, хотя подтвердить его или опровергнуть может только автор темы. Также вполне допускаю и уже об этом писал, что в системе не была установлена поддержка UTF-8.
-----------------------------------------------------------------------------------
"ls /" (C) Козьма Прутков
Вот нашёл
Вот нашёл ссылку на эту тему
http://blog.lexa.ru/2008/02/27/freebsd_ru_ruutf8_lc_collate.html