Поддержка локали
Замечание: Написал 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.
Есть только один очевидный недостаток использования локали - это скорость! Так что, используй локаль, только если тебе это действительно необходимо.
|