Установка PostgreSQL 9.1 и кодирование базы данных - PullRequest
6 голосов
/ 06 декабря 2011

Я только что выполнил свою первую установку PostgreSQL 9.1 на Ubuntu 10.04.

Примечание: я сделал это несколько раз на Windows с установщиком без проблем.

После небольшого усилияЯ настроил его для удаленного подключения через pgAdminIII.Однако после подключения к БД я был очень удивлен тем, что получил предупреждение о кодировке.Сама база данных "postgres" была создана с кодировкой "SQL_ASCII".Каждый раз, когда я устанавливал на Windows, он создавал базу данных postgres с «UTF8» - что, похоже, было бы намного лучше и остановило бы предупреждающее сообщение при открытии базы данных через pgAdminIII.

Isтам что-то я не так сделал?Есть ли параметр установки / параметр, который нужно использовать для установки кодировки по умолчанию?

И есть ли способ исправить это?Я читал некоторые вещи в Интернете, в которых говорится, что вам нужно тупить и восстанавливать, чтобы изменить кодировку базы данных, но я не уверен, что это даже возможно на postgres db.Это так?

Спасибо за помощь!

Ответы [ 3 ]

11 голосов
/ 06 декабря 2011

Соответствующим параметром является --locale=locale для команды initdb , которая инициализирует кластер базы данных.Если вы не укажете это явно, по умолчанию будет использоваться языковой стандарт системы.(Вы, вероятно, запускаете Ubuntu на языке 'C'.)

Подробнее об этом читайте в превосходном руководстве здесь .

В PostgreSQL вы можете все еще крадется в базе данных с другим языком, основывая новую базу данных на template0 вместо значения по умолчанию templeate1.Я цитирую руководство здесь :

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

Но я бы предпочел воссоздать кластер базы данных с желаемой локалью.Гораздо чище.


Редактировать: информация о доступных локалях

Вы можете только использовать локали, предоставляемые операционной системой.Я цитирую руководство здесь :

Какие локали доступны в вашей системе, под какими именами зависит от того, что было предоставлено поставщиком операционной системы и что было установлено.В большинстве систем Unix команда locale -a предоставит список доступных локалей.Windows использует более подробные названия локалей, например German_Germany или Swedish_Sweden.1252, но принципы те же.

Посмотрите на locale-gen в Unix-системе, если вы хотите использовать локаль, котораяеще не был создан.Важно понимать, что в вашей ОС можно установить несколько языковых стандартов, но для системных параметров, таких как LC_CTYPE, LC_COLLATE и т. Д., Можно выбрать только один из них. Посмотрите на вывод locale против locale -aв оболочке.Обычно это одинаково для всех, устанавливается через LC_ALL.

@ Дэвид: То, что вы сделали, возможно, решило вашу проблему, но вы могли бы сделать это проще.Также имейте в виду, что переменная окружения LANG предоставляет только по умолчанию для всех настроек локали.Если для любого из них установлено другое значение, LANG будет переопределено.Установите LC_ALL, чтобы переопределить любую существующую настройку.Вот один из многих сайтов в сети, рассказывающий вам больше об этом.

Чтобы проверить все текущие языковые настройки вашей базы данных (кластера), запустите в вашей базе данных:

SHOW ALL;

Или, более конкретно:

SELECT *
FROM   pg_settings
WHERE  name ~~ 'lc%';
10 голосов
/ 06 декабря 2011

Ответ, предоставленный Эрвином Брандштеттером, был полезен, но по какой-то причине он мне не помог. Причина в том, что я не смог запустить initdb. Я продолжал получать сообщение об ошибке «bash: команда не найдена» при попытке запустить его с локалью. Я закончил тем, что сделал:

изменение локали ОС. Для меня это было:

$ update-locale LANG=en_US.UTF-8

Примечание: тогда мне пришлось перезагрузить сервер. Чтобы подтвердить, что это сработало, просто запустите:

$ locale

с этим набором я остановил и уронил кластер:

$ su postgres
$ pg_dropcluster --stop 9.1 main

примечание: main - это кластер по умолчанию, созданный для меня (имя вашего кластера может отличаться)

$ pg_createcluster --start 9.1 main

Опять же, я просто заново создал кластер с тем же именем (основной).

Примечание: поскольку я выбрал одно и то же имя кластера (основное), мне пришлось вернуться и обновить мои файлы .conf. Для меня это были специально postgres.conf и pg_hba.conf для повторного включения удаленного доступа к коробке. Я не буду описывать, как это сделать, потому что в Интернете есть много документации для этого. Но если кто-то захочет отредактировать этот ответ позже, чтобы включить его, это было бы хорошо! :)

1 голос
/ 12 января 2012

Создание базы данных через initdb с опцией кодирования (-E или --encoding =) помогло мне в Mac Os X Snow Leopard:

initdb -D <database_directory> -E UTF8

Если вы инициируете базу данных таким образом, она также создаст шаблоны базы данных с правильной кодировкой.

Обратитесь к документации initdb здесь и документации по кодированию здесь , чтобы выбрать правильную кодировку.

...