Postgresq и русский язык

Проблема с русской локалью в 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? Например что показывает команда:

locale -a |grep -i utf8

-----------------------------------------------------------------------------------
"ls /" (C) Козьма Прутков

Это известно,

Это известно, что в линуксе всё хорошо.

locale -a |grep -i utf8

Не посмотреть потому что во FreeBSD 4.9 утилиты locale просто нет. Но локаль ru_RU.UTF-8 в /usr/share/locale присутствует. А что может зависеть от структуры таблицы?

wiki_site=> \d+ mediawiki.page;
                                               TABLE "mediawiki.page"
      COLUMN       |           Type           |                       Modifiers                        | Description
-------------------+--------------------------+--------------------------------------------------------+-------------
 page_id           | integer                  | NOT NULL DEFAULT NEXTVAL('page_page_id_seq'::regclass) |
 page_namespace    | smallint                 | NOT NULL                                               |
 page_title        | text                     | NOT NULL                                               |
 page_restrictions | text                     |                                                        |
 page_counter      | bigint                   | NOT NULL DEFAULT 0                                     |
 page_is_redirect  | smallint                 | NOT NULL DEFAULT 0                                     |
 page_is_new       | smallint                 | NOT NULL DEFAULT 0                                     |
 page_random       | numeric(15,14)           | NOT NULL DEFAULT random()                              |
 page_touched      | timestamp WITH time zone |                                                        |
 page_latest       | integer                  | NOT NULL                                               |
 page_len          | integer                  | NOT NULL                                               |
 titlevector       | tsvector                 |                                                        |

Тогда копайте в

Тогда копайте в сторону поддержки ru_RU.UTF-8 в FreeBSD. PostgreSQL использует системную локаль для выполнения преобразований строк в верхний и нижний регистр. Попробуйте для примера взять Perl и попробовать там - думаю результат будет такой же.

Что касается структуры таблиц - была когда-то такая фигня в PostgreSQL младших версий, что вроде как на CHAR работало а то ли на VARCHAR то ли на TEXT нет. Но помоему это уже исправили давным давно - хотя можете поробовать - чем чёрт не шутит.

Мне всё-таки кажется, что проблема в том, что в системе нет нормальной локали ru_RU.UTF-8. Проверьте на Perl.
-----------------------------------------------------------------------------------
"ls /" (C) Козьма Прутков

Не силён в

Не силён в перле. Попробовал так:

#!/usr/bin/perl
USE utf8;
#use POSIX qw(locale_h);
 
#setlocale(LC_ALL, "ru_RU.UTF-8");
 
$str = uc("\n текст Текст Text\n");
print $str;

Работает. Выводит ТЕКСТ ТЕКСТ TEXT
Но думаю это не зависит от локали.

А вот так не работает даже в линуксе:

#!/usr/bin/perl
#use utf8;
USE POSIX qw(locale_h);
 
setlocale(LC_ALL, "ru_RU.UTF-8");
 
$str = uc("\n текст Текст Text\n");
print $str;

У меня хотя и с

У меня хотя и с warning'ами но работает:

#!/usr/bin/perl
use utf8;

print uc("ТеКсТ")."\n";
print lc("ТеКсТ")."\n";


ТЕКСТ

текст

-----------------------------------------------------------------------------------

"ls /" (C) Козьма Прутков


Для того что бы

Для того что бы проверить локаль я думаю нужно что то вроде этого.

#!/usr/bin/perl
 
USE POSIX qw(locale_h);
setlocale(LC_ALL, "ru_RU.UTF-8");
 
$str = uc("\n текст Текст Text\n");
print $str;

А с 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

Опции просмотра комментариев

Выберите предпочитаемый вами способ показа комментариев и нажмите "Сохранить настройки" для активации изменений.

Back to top

(С) Виктор Вислобоков, 2008-2023