Руководство администратора по PostgreSQL
Предыдущий Глава 3. Опции конфигурации Следующий

Поддержка локали

Замечание: Написал Oleg Bartunov.Смотри на web странице Олега дополнительную информацию про локаль и поддержку русского языка.

Во время выполнения проекта для компании в Москве, Россия, я столкнулся с проблемой postgresql - он не поддерживал национальные алфавиты. Поискав возможные пути обхода, я решил разработать поддержку локали сам. Я не программист на C, но у меня уже был некоторый опыт программирования с локалью, когда я работал с perl (отладка) и glimpse. После нескольких дней ковыряния исходников Postgres, я сделал несколько маленьких правочек в src/backend/utils/adt/varlena.c и src/backend/main/main.c и получил то что хотел! Я сделал поддержку только для LC_CTYPE и LC_COLLATE, но позднее LC_MONETARY была добавлена другими. Я получил много сообщений от людей об этом патче, и поэтому решил послать его разработчикам, и (к моему удивлению) он был включён в дистрибутив Postgres.

Люди часто жаловались, что локаль у них не работает. Вот несколько распространённых ошибок:

  • Неправильно сконфигурированный postgresql перед компиляцией. Ты должен запустить configure с опцией --enable-locale, чтобы разрешить поддержку локали. Неправильно настроенная среда при запуске postmaster. Нужно определять переменные среды LC_CTYPE и LC_COLLATE перед запуском postmaster, потому что сервер берёт информацию о локали из среды. Я использую такой сценарий shell (runpostgres):
           #!/bin/sh
           
           export LC_CTYPE=koi8-r
           export LC_COLLATE=koi8-r
           postmaster -B 1024 -S -D/usr/local/pgsql/data/ -o '-Fe'
    
    и запускаю его из rc.local посредством
    
           /bin/su - postgres -c "/home/postgres/runpostgres"
    
  • Плохая поддержка локали в ОС (например, поддержка локали в libc под Linux несколько раз изменялась и это привело к многочисленным проблемам). Последний perl также имеет поддержку локали и если локаль не работает, то perl -v выразит недовольство:
           8:17[mira]:~/WWW/postgres>setenv LC_CTYPE not_exist
           8:18[mira]:~/WWW/postgres>perl -v
           perl: warning: Setting locale failed.
           perl: warning: Please check that your locale settings:
           LC_ALL = (unset),
               LC_CTYPE = "not_exist",
               LANG = (unset)
           are supported and installed on your system.
           perl: warning: Falling back to the standard locale ("C").
    
  • Неправильное расположение файлов локали! Возможные местоположения локали: /usr/lib/locale (Linux, Solaris), /usr/share/locale (Linux), /usr/lib/nls/loc (DUX 4.0). Ищи в man locale правильное местоположение. Под Linux я создаю символическую ссылку между /usr/lib/locale и /usr/share/locale чтобы быть уверенным, что следующая libc не грохнет мне локаль.

Какая польза?

Ты можешь использовать ~* и order с операторами для строк, содержащих символы национальных алфавитов. Не английским пользователям определённо это нужно. Если ты не хочешь использовать свойство локали, просто удали определение переменной USE_LOCALE.

Какие недостатки?

Есть только один очевидный недостаток использования локали - это скорость! Так что, используй локаль, только если тебе это действительно необходимо.


Предыдущий Начало Следующий
Параметры сборки (make) В начало главы Kerberos идентификация


Наш баннер
Вы можете установить наш баннер на своем сайте или блоге, скопировав этот код:
RSS новости