Настройка локалей в Linux для PostgreSQL - PullRequest
7 голосов
/ 08 февраля 2011

У меня проблемы с настройкой и запуском конкретной базы данных.Я пытаюсь восстановить дамп postgreSQL, полученный от кого-то другого.Я пробовал несколько способов, но безрезультатно.

  1. Прямо из pg_restore

    pg_restore -C -d postgres --exit-on-error maggie_prod_20111221.dump.sql

  2. Создание базы данныхи табличное пространство сначала

    createdb -T template0 maggieprod -E LATIN1

    SQL: CREATE TABLESPACE magdat OWNER maggie LOCATION '/somewhere/magdat';

    pg_restore -v -d template1 maggie_prod_20110121.dump.sql

Используя первый метод, я получаюследующее:

pg_restore: [archiver (db)] Error while PROCESSING TOC:

pg_restore: [archiver (db)] Error from TOC entry 2308; 1262 16386 DATABASE maggieprod postgres

pg_restore: [archiver (db)] could not execute query: ERROR: encoding LATIN1 does not match locale en_CA.utf8

DETAIL: The chosen LC_CTYPE setting requires encoding UTF8. Command was: CREATE DATABASE maggieprod WITH TEMPLATE = template0 ENCODING = 'LATIN1' TABLESPACE = magdat;

И с использованием второго,когда я пытаюсь создать базу данных, я получаю:

createdb: database creation failed: ERROR: encoding LATIN1 does not match locale en_CA.utf8

DETAIL: The chosen LC_CTYPE setting requires encoding UTF8.

Так что мне кажется, что я не могу создать базу данных с кодировкой LATIN1?Это почему?Я новичок в локалях и кодировке и не очень разбираюсь в них.Я просто знаю, что дамп был сделан из базы данных LATIN1.

Вывод locale:

LANG=en_CA.utf8 LC_CTYPE="en_CA.utf8" LC_NUMERIC="en_CA.utf8" LC_TIME="en_CA.utf8" LC_COLLATE="en_CA.utf8" LC_MONETARY="en_CA.utf8" LC_MESSAGES="en_CA.utf8" LC_PAPER="en_CA.utf8" LC_NAME="en_CA.utf8" LC_ADDRESS="en_CA.utf8" LC_TELEPHONE="en_CA.utf8" LC_MEASUREMENT="en_CA.utf8" LC_IDENTIFICATION="en_CA.utf8" LC_ALL=

И вывод locale -aэто:

C en_AG en_AG.utf8 en_AU.utf8 en_BW.utf8 en_CA.utf8 en_DK.utf8 en_GB.utf8 en_HK.utf8 en_IE.utf8 en_IN en_IN.utf8 en_NG en_NG.utf8 en_NZ.utf8 en_PH.utf8 en_SG.utf8 en_US.utf8 en_ZA.utf8 en_ZW.utf8 POSIX

Я не вижу LATIN1 во второй команде, не так ли?Если да, то как мне добавить его?Правильно ли для меня предположить, что мне нужно изменить локаль на моем компьютере?Если так, есть ли способ сделать это только для postgreSQL?Кроме того, когда я пытаюсь открыть дамп, я вижу много мусорных символов, я предполагаю, что это из-за кодировки, как бы я посмотрел правильно?

Спасибо за любую помощь.

Ответы [ 3 ]

6 голосов
/ 08 февраля 2011

Вам необходимо создать базу данных с языковым стандартом, соответствующим кодировке, например,

createdb -T template0 maggieprod -E LATIN1 --locale=en_CA

Поскольку у вас установлены не все локали, я думаю, вы используете Debian или Ubuntu. В этом случае позвоните dpkg-reconfigure locales или установите пакет locales-all.

Либо создайте базу данных с кодировкой UTF8. Пока все ваши клиенты правильно устанавливают кодировку клиента, это не должно иметь значения.

1 голос
/ 16 мая 2011

У меня были проблемы с использованием синтаксиса createb от The_Denominater, поэтому я сделал это следующим образом:

CREATE DATABASE maggieprod WITH ENCODING = 'LATIN1'
  LC_CTYPE = 'en_CA' LC_COLLATE = 'en_CA'
  TEMPLATE template0;
0 голосов
/ 08 апреля 2012

Если вам все еще интересно, команда recode преобразует дамп базы данных в выбранный вами набор символов, прежде чем импортировать его в новую базу данных. Смотрите эту ссылку - http://blog.e -shell.org / 134

...