Настройка локалей в Linux для PostgreSQL

У меня возникли проблемы с настройкой и запуском конкретной базы данных. Я пытаюсь восстановить дамп 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? Кроме того, когда я пытаюсь открыть дамп, я вижу много мусорных символов, я предполагаю, что это из-за кодировки, как мне правильно на это посмотреть?

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


person The_Denominater    schedule 08.02.2011    source источник


Ответы (3)


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

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

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

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

person Peter Eisentraut    schedule 08.02.2011
comment
У меня сработала установка пакета locales-all. Спасибо. - person gdonald; 12.04.2020

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

CREATE DATABASE maggieprod WITH ENCODING = 'LATIN1'
  LC_CTYPE = 'en_CA' LC_COLLATE = 'en_CA'
  TEMPLATE template0;
person jsmith    schedule 16.05.2011

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

person vfclists    schedule 08.04.2012