PostGres 7.3 и CP1251

Eridan
Дата: 28.05.2003 12:41:39
Проблема:
На OpenBSD создал базу строчкой вида

initdb -E win --lc-collate=ru_RU.CP1251 --lc-ctype=ru_RU.CP1251 -D /var/postgresql/data

Не работает функция upper(), хотя с сортировкой все в порядке.

Какие параметры нужно указать?
1024
Дата: 28.05.2003 12:48:24
У меня такая же фигня. Где-то прочитал что при подключении нужно устанавливать переменную LANG, но не проверял, врать не буду. Хотя мож чё-то с локалью, у меня и в ПХП upper() и lower() неправильно русские буквы меняют.
Shweik
Дата: 28.05.2003 14:26:35
Результат Функции upper() (да и других стринговых функций) помимо всего прочего зависит от параметра -E утилиты createdb.
-------------------
Непонимаю зачем использовать локаль базы CP1251 на сервере
где основная локаль заведомо KOI8-R???
Например.
Делаем inidb без явного указания --lc-collate и --lc-ctype=
- обычно локаль к этому времени настроена как должно.
initdb прописывает в postgresql.conf такие слова:
#
# Locale settings
#
# (initialized by initdb -- may be changed)
LC_MESSAGES = 'ru_RU.KOI8-R'
LC_MONETARY = 'ru_RU.KOI8-R'
LC_NUMERIC = 'ru_RU.KOI8-R'
LC_TIME = 'ru_RU.KOI8-R'
Замечательно! Теперь cоздаем базу.
createdb -E KOI8 mdb2
И все. Данные хранятся в Koi8 - стринговые функции работают "на ура" -
клиентские приложения просто говорят в какой кодировке работают (
мои клиенты на Delphi начинают трудовую смену set client_encoding = WIN 8-) ).
И все счастливы! ;o)
А я по приколу сделала такой финт - createdb -E WIN mdb3
Результаты меня нисколько не удивили : фунцкия upper() стала возвращать результат свойственный функции lower(). И наоборот ! ;)
Так что вывод один - Храните Ваши данные в единой кодировке
(если параметр -E не указан - поумолчанию SQL_ASCII)
-----------------------------------------
OS - FreeBSD 4.3 STABLE. Postgers 7.3 /7.3.2
Shweik
Дата: 28.05.2003 14:27:46
Результат Функции upper() (да и других стринговых функций) помимо всего прочего зависит от параметра -E утилиты createdb.
-------------------
Непонимаю зачем использовать локаль базы CP1251 на сервере
где основная локаль заведомо KOI8-R???
Например.
Делаем inidb без явного указания --lc-collate и --lc-ctype=
- обычно локаль к этому времени настроена как должно.
initdb прописывает в postgresql.conf такие слова:
#
# Locale settings
#
# (initialized by initdb -- may be changed)
LC_MESSAGES = 'ru_RU.KOI8-R'
LC_MONETARY = 'ru_RU.KOI8-R'
LC_NUMERIC = 'ru_RU.KOI8-R'
LC_TIME = 'ru_RU.KOI8-R'
Замечательно! Теперь cоздаем базу.
createdb -E KOI8 mdb2
И все. Данные хранятся в Koi8 - стринговые функции работают "на ура" -
клиентские приложения просто говорят в какой кодировке работают (
мои клиенты на Delphi начинают трудовую смену set client_encoding = WIN 8-) ).
И все счастливы! ;o)
А я по приколу сделала такой финт - createdb -E WIN mdb3
Результаты меня нисколько не удивили : фунцкия upper() стала возвращать результат свойственный функции lower(). И наоборот ! ;)
Так что вывод один - Храните Ваши данные в единой кодировке
(если параметр -E не указан - поумолчанию SQL_ASCII)
-----------------------------------------
OS - FreeBSD 4.3 STABLE. Postgers 7.3 /7.3.2
Eridan
Дата: 28.05.2003 14:36:56
Дело в том, что у меня уже есть стопятьсот баз данных, которые все в Win1251. И конвертить как-то... не очень хочется :)

И мне казалось, что createdb берет параметр --encoding(если не указан) от initdb, где я его явно указал.

Такие вот дела.
Shweik
Дата: 28.05.2003 14:38:01
Блин ну и лагает этот форум..... каашмар (с инетом все ок - канал дай бог каждому 8)) да и пинг на россию пристойный )
А вот ASP - само по себе фигня полная.....
а возможности этого этого форума просто убогие... - например я бы с удовольствием похерил бы ошибочный пост, или отредактил его ан нет.
Сорри за оффтоп просто достало малехо.
Впрочем мож я неправ - и просто сервак задыхается под наплывом коннектов?
Eridan
Дата: 28.05.2003 14:42:44
Хотя все равно с возможностями у него конечно ен все в порядке :( Вот YaBB рулит.
Shweik
Дата: 28.05.2003 15:06:05
Мдас печально - хотя наваять скрипт конвертирования можно довольно просто.
Например
create -E KOI8 $2
pg_dump -c $1 | win2koi8 | psql $2
dropdb $1
Ну и получив список баз запихнул это дело в цикл.
Усе. Пробелы возникнут разве что при наличии BLOB полей (я их маловато юзал так что не подскажу хотя дампить их есстественно можно 8) ).
А что касаемо установок createdb....
Похоже что если явно не указывать createdb _копирует_ установку Encoding из template1. У меня Encoding template1 SQL_ASCII. Соотв делая
createdb mdb1 получаем базу mdb1 с кодировочкой SQL_ASCII.
IMHO все вполне логично.
Кстати на эти грабли наступают многие из-за невнимательного RTFM.
Eridan
Дата: 28.05.2003 15:32:12
К счастью это самый FM я много раз R вдоль и поперек. Однако не помогает. Может, локаль крива? Не в курсе, где можно локаль ВИН1251 для Опена выкачать?
Shweik
Дата: 28.05.2003 16:05:00
К сожалению никогда не работал с OpenBSD хотя слышал много лестных отзывов
Но если бы даже пришлось работать основной локалью была бы конечно KOI8.
А что утебя написал Initdb в конце postgresql.conf про локаль?
Может он не увидел что у тебя выставлено в шеле?
Да и какой же получилась Encode в у template1 -запости вывод комманды psql -c "\l" template1
И все равно удивительно, зачем может понадобиться устанавливать основной
локалью cp1251... там где общепринята KOI8? 8_)
IMHO это также обосновано как под WIN пытаться все переделать под KOI8 8))
Проще "научить" клиентские проги указывать локаль, в которой они хотят получать данные.
Кстати для пользователяв PG вроде можно прописать набор установок переменных типа SET clien_encoding=WIN; SET enable_seqscan=true ; SET log_duration=true;
Правда пока что такой необходимости не было как это работает я не вкурсе.