Подтвердить что ты не робот

PG:: Ошибка: ERROR: новая кодировка (UTF8) несовместима

Я установил postgresql-9.2.4 из источника, теперь в приложении rails, когда я выполняю:

rake db:create команда:

$ bin/rake db:create RAILS_ENV="test"
PG::Error: ERROR:  new encoding (UTF8) is incompatible with the encoding of the template database (SQL_ASCII)
HINT:  Use the same encoding as in the template database, or use template0 as template.
: CREATE DATABASE "verticals_test" ENCODING = 'unicode'
/home/vagrant/my-project/.gems/ruby/1.9.1/gems/activerecord-3.2.12/lib/active_record/connection_adapters/postgresql_adapter.rb:652:in `exec
....
bin/rake:16:in `load'
bin/rake:16:in `<main>'
Couldn't create database for {"adapter"=>"postgresql", "encoding"=>"unicode", "database"=>"my_db", "host"=>"localhost", "pool"=>5, "username"=>"my_user", "password"=>"my_password"}

любая идея?

4b9b3361

Ответ 1

Хорошо, ниже шагов решена проблема:

  • Во-первых, нам нужно отбросить шаблон1. Шаблоны не могут быть отброшены, поэтому мы сначала модифицируем его так, чтобы обычная база данных:

    UPDATE pg_database SET datistemplate = FALSE WHERE datname = 'template1';

  • Теперь мы можем отказаться от него:

    DROP DATABASE template1;

  • Теперь пришло время создать базу данных из шаблона0 с новой кодировкой по умолчанию:

    CREATE DATABASE template1 WITH TEMPLATE = template0 ENCODING = 'UNICODE';

  • Теперь измените template1 так, чтобы его на самом деле был шаблон:

    UPDATE pg_database SET datistemplate = TRUE WHERE datname = 'template1';

  • Теперь переключитесь на шаблон 1 и VACUUM FREEZE:

    \c template1

    VACUUM FREEZE;

Проблема должна быть решена.

Ответ 2

Убедитесь, что у вас есть правильная настройка в вашем файле database.yml. Вы должны использовать template0, как показывает ошибка:

test:
  adapter: postgresql
  encoding: unicode
  database: your_db_name
  template: template0
  host: localhost
  ...

Ответ 3

Если вы используете Debian, при установке пакета postgresql он будет использовать вашу локаль по умолчанию для создания базы данных template1. Если вы не настроили свою ОС на использование UTF-8 в качестве локали по умолчанию, вы столкнетесь с этой ошибкой.

В дополнение к приведенным выше решениям, если вы находитесь на новой установке и не имеете активных баз данных, вы можете удалить пакет postgresql и установить языковой стандарт по умолчанию для UTF-8. Преимущество этого метода заключается в том, что вы можете опустить локальную информацию при создании баз данных в будущем.

dpkg-reconfigure locales

Если вы не видите желаемый язык, установите пакет locales-all

apt-get install locales-all

Затем удалите postgresql

apt-get remove --purge postgresql-<version>

Затем переустановите или еще лучше обновите до последней версии, которая не находится в стабильной версии Debian.

Ответ 4

Если ваша установка postgres является новой, и вы еще не заполнили какие-либо базы данных, вы можете удалить свой каталог data и повторно запустить команду initdb с флагом для создания баз данных с использованием UTF-8.

Измените эту команду, чтобы она соответствовала вашей установке postgres. Флаг -E указывает, какая кодировка символов должна быть по умолчанию. Другие кодировки символов перечислены здесь.

/usr/local/pgsql/bin/initdb -E UTF8 -D /usr/local/pgsql/data -U postgres

Должна быть ошибка и сказать, что каталог data не пуст. Следуйте инструкциям и удалите каталог, а затем запустите команду. (Или удалите каталог data, прежде чем вы начнете, но всегда приятно видеть инструкции для себя.)

Ответ 5

У меня была аналогичная проблема. Моя database.yml была такой: -

default: &default
  adapter: postgresql
  encoding: unicode
  pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>

development:
  <<: *default
  database: chatapp_development

test:
  <<: *default
  database: chatapp_test

production:
  <<: *default
  database: chatapp_production
  username: chatapp
  password: <%= ENV['CHATAPP_DATABASE_PASSWORD'] %>

Я добавил шаблон: template0 к настройкам по умолчанию

default: &default
  adapter: postgresql
  template: template0
  encoding: unicode
  pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>

И он работал