PG :: Ошибка: ОШИБКА: новая кодировка (UTF8) несовместима


84

Я установил 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"}

Есть идеи?

Ответы:


233

Хорошо, следующие шаги решили проблему:

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

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

  2. Теперь мы можем его отбросить:

    DROP DATABASE template1;

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

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

  4. Теперь измените template1, чтобы он стал шаблоном:

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

  5. Теперь переключитесь на template1 и ЗАМОРОЖИТЕ шаблон:

    \c template1

    VACUUM FREEZE;

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


2
@tokhi Это рабочее решение. Я не слишком хорошо знаком с posgresql, но мой единственный маленький шаг 0: sudo -u postgres psql postgresдля debian или аналогичной ОС.
croonx

42

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

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

У меня template0в конфиге не было, если разместить, то получу:PG::Error: ERROR: permission denied to copy database "template0" : CREATE DATABASE "my_database_test" ENCODING = 'unicode' TEMPLATE = "template0"
tokhi

странно ... а для developmentenv так же ведет себя ?
mihai

3
Может ли кто-нибудь объяснить разницу между template0 и template1 и почему это работает?
Джейк

@Jake см postgresql.org/docs/10/static/manage-ag-templatedbs.html - все имеет смысл после прочтения этой страницы :-)
Markus

12

Если вы используете 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 .


2
Я установил локаль по умолчанию на en_US.UTF-8 и выполнил ваши инструкции по переустановке postgres, но после этого все равно получил ту же ошибку.
Саймон Вудсайд

Согласитесь с Саймоном. Какая трата времени :(
karni

После установки локалей все заработало как по волшебству :)
Дэниел Горди

6

Что касается меня, я просто меняю строку с database.yml:

encoding: unicode

кому:

encoding: SQL_ASCII

просто так и все работает.


2
Это лучше, чем принятое решение, но я новичок в этом, поэтому я могу не знать о последствиях изменения Unicode на SQL_ASCII.
indieNik

1
Использование SQL_ASCII - не лучший вариант по умолчанию.
Дуг

5

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

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

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

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


2

У меня была аналогичная проблема. Моя 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'] %>

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

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

И это сработало


Ах, порядок важен! template: template0 ДОЛЖЕН появиться раньше, encoding: unicodeчем кажется.
Дэн
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.