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"}

будь-яка ідея?

Відповіді:


229

Гаразд, нижче описані кроки вирішили проблему:

  1. Спочатку нам потрібно скинути шаблон1. Шаблони не можна скидати, тому спочатку ми модифікуємо їх так, щоб це була звичайна база даних:

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

  2. Тепер ми можемо скинути це:

    DROP DATABASE template1;

  3. Настав час створити базу даних із шаблону0 з новим кодуванням за замовчуванням:

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

  4. Тепер змініть шаблон1, так що насправді це шаблон:

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

  5. Тепер перейдіть на шаблон1 і ЗАМОРОЖІТЬ ШАБЛОН шаблон:

    \c template1

    VACUUM FREEZE;

Проблему слід вирішити.


1
@tokhi Це робоче рішення. Я не дуже знайомий з posgresql, але мій єдиний маленький крок 0: sudo -u postgres psql postgresдля debian або подібної ОС.
croonx

41

Переконайтеся, що у вашому 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"
розміщу

це дивно ... чи поводиться воно так само і для developmentоточуючих?
Міхай

3
Хтось може пояснити різницю між шаблоном0 та шаблоном1 і чому це працює?
Джейк

@Jake дивіться postgresql.org/docs/10/static/manage-ag-templatedbs.html - все має сенс після прочитання цієї сторінки :-)
Маркус

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
Це краще, ніж прийняте рішення, але я новачок у цьому матеріалі, тому, можливо, я не знаю про наслідки зміни юнікоду на 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'] %>

Я додав шаблон: 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.