Добрый день.
Стоит PostgreSQL 9.0.2 на ОС Windows XP. Кодировка UTF-8; локаль Russian, Russia; client_encoding= WIN
Как тоже самое сделать в OpenSuse 12.1?
PostgreSQL 9.1.3, кодировка UTF-8, но и локаль ru_RU.UTF-8. Установил локаль ru_RU.CP1251 в ОС, но при попытке через initdb задать эту локаль, ругается на несоответсвие кодировки и локали. Пробовал изменить локаль системы по инструкции http://ru.opensuse.org/SDB:Изменение_системной_кодировки_на_cp1251 - ОС вообще на запустилась.
Если оставить и кодировку и локаль в UTF-8, но с client_encoding= WIN, не раскрываются архивы базы из Windows: 152 ошибки типа
pg_restore: [archiver (db)] Error from TOC entry 7804; 0 161192 TABLE DATA privilegecategory ADMIN
pg_restore: [archiver (db)] COPY failed: ОШИБКА: не удалось определить, какой порядок сортировки использовать для сравнения строк
ПОДСКАЗКА: Задайте правило сравнения явно в предложении COLLATE.
КОНТЕКСТ: COPY privilegecategory, строка 2: "2 amp 50746 2011-02-10 16:37:50.64 2011-09-08 03:52:16.625 ADMIN ADMIN \N 208 208 -572555900 \N"
pg_restore: creating INDEX salestable_salesid_uniq_idx
pg_restore: [archiver (db)] Error from TOC entry 7223; 1259 4648947 INDEX salestable_salesid_uniq_idx ADMIN
pg_restore: [archiver (db)] could not execute query: ОШИБКА: не удалось определить, какой порядок сортировки использовать для сравнения строк
ПОДСКАЗКА: Задайте правило сравнения явно в предложении COLLATE.
Command was: CREATE UNIQUE INDEX salestable_salesid_uniq_idx ON salestable USING btree (salesid);
pg_restore: creating FK CONSTRAINT FK_citotable_citoid_citoline
pg_restore: [archiver (db)] Error from TOC entry 7347; 2606 6259791 FK CONSTRAINT FK_citotable_citoid_citoline ADMIN
pg_restore: [archiver (db)] could not execute query: ОШИБКА: в целевой внешней таблице "citotable" нет ограничения уникальности, соответствующего данным ключам
Command was: ALTER TABLE ONLY citoline
ADD CONSTRAINT "FK_citotable_citoid_citoline" FOREIGN KEY (citoid) REFERENCES citotable(citoid);
Я, конечно, могу отдельно сделать структуру, отдельно данные INSERT-скриптами, но к БД стучаться будут клиенты из Windows с соответствующей кодировкой.
P.S. 2ю и 3ю ошибку удалось устранить путем отдельного восстановления структуры и данных.
> при попытке через initdb
> при попытке через initdb задать эту локаль, ругается на несоответсвие кодировки и локали
А если попробовать дать initdb кодировку WIN1251, а не ru_RU.CP1251?
А если попробовать дать...
В charmaps нет такой локали. initdb не находит локаль и задает ее в ru_RU.UTF-8
Каким же образом в Windows работают разные кодировка и локаль? Поискал на просторах интернета - предлагают менять локаль вместе с кодировкой....Меня такой вариант не устраивает из-за причуд программистов.
> В charmaps нет такой
> В charmaps нет такой локали. initdb не находит локаль и задает ее в ru_RU.UTF-8
Очень странно. В документации на PostgreSQL такая локаль есть, а у вас её нет.
По поводу остального, изложу своё понимание.
У каждой БД есть своя кодировка. Кодировка по умолчанию задаётся initdb, но при создании новой БД никто не мешает вам указать другую кодировку. Чтобы загрузить данные в БД клиент и сервер должны работать согласовать кодировку, именно для этого и служит команда SET CLIENT_ENCODING, иначе, вы получите ошибку о появлении недопустимых символов. Но есть ещё и 3-й момент. Поскольку PostgreSQL не содержит собственной локали, она использует для работы с БД в определённой кодировке, системную локаль, т.е. все правила сортировки и сравнения строк берутся именно из системной локали.
Теперь с учётом вышеизложенного, становится понятно, что нужно сделать:
1. В операционной системе установить нужную локаль. Для Windows это будет ru_RU.CP1251
2. Перезапустить PostgreSQL, чтобы он обновил список доступных системных локалей
3. Сделать initdb или createdb с нужной кодировкой. (см. список поддерживаемых кодировок в http://postgresql.ru.net/manual/multibyte.html)
4. При подключении к нужной БД выдать клиенту нужную команду SET CLIENT_ENCODING. Какую кодировку здесь выбрать зависит от клиентского приложения. Если это Windows приложение, оно и так работает в WIN1251, а если это консоль linux и psql то нужно указать UTF-8.
После этого никаких проблем быть не должно!
> предлагают менять локаль вместе с кодировкой....Меня такой вариант не устраивает из-за
> причуд программистов.
На самом деле хороший вариант. БД в UTF-8, на виндовом клиенте вы говорите что SET CLIENT_ENCOFING=WIN1251 и все счастливы.
> Очень странно. В
> Очень странно. В документации на PostgreSQL такая локаль есть, а у вас её нет.
Локаль берется из системы. В OpenSuse 12.1 WIN нету, есть только CP1251.
Я попробовал восстановить базу из архива при кодировке WIN1251 и локали ru_RU.CP1251 - те же ошибки.
Попробовал по Вашему совету изменить локаль в ОС....ОС такое не понравилось.
> На самом деле хороший вариант. БД в UTF-8, на виндовом клиенте вы говорите что SET CLIENT_ENCOFING=WIN1251 и все счастливы.
Я прекрасно понимаю, что все должно получится. CLIENT_ENCODING=WIN , но положение это не спасает.
> Локаль берется из системы.
> Локаль берется из системы. В OpenSuse 12.1 WIN нету, есть только CP1251.
Команда SET CLIENT_ENCODING работает с одной из поддерживаемых PostgreSQL кодировок, а не системой.
> Я попробовал восстановить базу из архива при кодировке WIN1251 и локали ru_RU.CP1251 - те же ошибки
Не удивлён
> Попробовал по Вашему совету изменить локаль в ОС....ОС такое не понравилось.
Не изменить, а добавить.
> Я прекрасно понимаю, что все должно получится. CLIENT_ENCODING=WIN , но положение это не спасает.
Это получится только в случае если база в WIN1251, а клиент на винде, на юниксе нужен UTF8 и дамп базы в UTF8.