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"}
любая идея?
Ответы
Ответ 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 } %>
И он работал