PG :: Error: ERROR: nowe kodowanie (UTF8) jest niekompatybilne

84

Zainstalowałem postgresql-9.2.4ze źródła, teraz w aplikacji railsowej, kiedy wykonuję:

rake db:create polecenie, które otrzymuję:

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

dowolny pomysł?

tokhi
źródło

Odpowiedzi:

229

Ok, poniższe kroki rozwiązały problem:

  1. Najpierw musimy usunąć template1. Szablony nie mogą zostać usunięte, więc najpierw modyfikujemy je, aby były zwykłą bazą danych:

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

  2. Teraz możemy to upuścić:

    DROP DATABASE template1;

  3. Teraz czas na stworzenie bazy danych z template0 z nowym domyślnym kodowaniem:

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

  4. Teraz zmodyfikuj template1, aby faktycznie był szablonem:

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

  5. Teraz przejdź do template1 i ZAMRAŻANIE PRÓŻNIOWE szablon:

    \c template1

    VACUUM FREEZE;

Problem powinien zostać rozwiązany.

tokhi
źródło
1
@tokhi To działa rozwiązanie. Nie jestem zbyt dobrze zaznajomiony z posgresql, ale mój jedyny mały krok 0: sudo -u postgres psql postgresdla Debiana lub podobnego systemu operacyjnego.
croonx
41

Upewnij się, że w database.ymlpliku znajduje się poprawna konfiguracja . Powinieneś użyć template0, jak sugeruje błąd:

test:
  adapter: postgresql
  encoding: unicode
  database: your_db_name
  template: template0
  host: localhost
  ...
mihai
źródło
Nie miałem template0w swoim configu, jeśli to umieszczę to otrzymuję:PG::Error: ERROR: permission denied to copy database "template0" : CREATE DATABASE "my_database_test" ENCODING = 'unicode' TEMPLATE = "template0"
tokhi
to dziwne ... czy zachowuje się tak samo dla środowiska development?
mihai
3
Czy ktoś mógłby wyjaśnić różnicę między template0 i template1 i dlaczego to działa?
Jake
@Jake patrz postgresql.org/docs/10/static/manage-ag-templatedbs.html - po przeczytaniu tej strony wszystko ma sens :-)
Markus
12

Jeśli używasz Debiana, po zainstalowaniu pakietu postgresql użyje on domyślnych ustawień regionalnych do utworzenia bazy danych template1. Jeśli nie skonfigurowałeś swojego systemu operacyjnego do używania UTF-8 jako domyślnych ustawień regionalnych, napotkasz ten błąd.

Oprócz powyższych rozwiązań, jeśli korzystasz z nowej instalacji i nie masz aktywnych baz danych, możesz usunąć pakiet postgresql i ustawić domyślne ustawienia regionalne na UTF-8. Zaletą tej metody jest możliwość pominięcia informacji o lokalizacji podczas tworzenia baz danych w przyszłości.

dpkg-reconfigure locales

Jeśli nie widzisz żądanych ustawień regionalnych, zainstaluj pakiet locales-all

apt-get install locales-all

Następnie usuń postgresql

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

Następnie przeinstaluj lub jeszcze lepiej zaktualizuj do najnowszej wersji, która nie jest w stabilnej wersji Debiana .

zawietrzny
źródło
2
Ustawiłem domyślne ustawienia regionalne na en_US.UTF-8 i postępowałem zgodnie z instrukcjami, aby ponownie zainstalować postgres, ale nadal otrzymuję ten sam błąd.
Simon Woodside
Zgadzam się z Simonem. Co za strata czasu :(
karni
Po zainstalowaniu lokalizacji zaczęło działać jak magia :)
Daniel Gordi
6

Jak dla mnie to po prostu zmieniam linię z database.yml:

encoding: unicode

do:

encoding: SQL_ASCII

tylko to i wszystko działa.

Yakob Ubaidi
źródło
2
Jest to lepsze niż przyjęte rozwiązanie, ale jestem nowy w tej kwestii, więc mogę nie być świadomy skutków zmiany Unicode na SQL_ASCII.
indieNik,
1
Używanie SQL_ASCII nie jest dobrym rozwiązaniem domyślnym.
Doug
5

Jeśli Twoja instalacja Postgres jest nowa i nie datazapełniłeś jeszcze żadnych baz danych, możesz usunąć katalog i ponownie uruchomić polecenie initdb z flagą, aby utworzyć bazy danych przy użyciu UTF-8.

Zmodyfikuj to polecenie, aby pasowało do twojej instalacji postgres. -EFlaga mówi co kodowanie znaków powinno być domyślny. Tutaj wymieniono inne kodowania znaków .

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

Powinien pojawić się błąd i powiedzieć, że datakatalog nie jest pusty. Postępuj zgodnie z instrukcjami i usuń katalog, a następnie ponownie uruchom polecenie. (Lub usuń datakatalog przed rozpoczęciem, ale zawsze dobrze jest zobaczyć instrukcje dla siebie).

littleforest
źródło
2

Miałem podobny problem. Moja baza danych.yml wyglądała tak: -

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'] %>

Dodałem template: template0 do ustawień domyślnych

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

I zadziałało

Hussain Niazi
źródło
Ach, kolejność jest ważna! template: template0 MUSI przyjść, zanim encoding: unicodesię wydaje.
Dan Bechard