it-swarm.com.de

PG :: Fehler: FEHLER: Neue Codierung (UTF8) ist nicht kompatibel

Ich habe installiert postgresql-9.2.4 von der Quelle, jetzt in Rails App, wenn ich ausführe:

rake db:create Kommando bekomme ich:

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

irgendeine Idee?

76
tokhi

Ok, die folgenden Schritte haben das Problem behoben:

  1. Zuerst müssen wir template1 löschen. Vorlagen können nicht gelöscht werden. Daher ändern wir sie zunächst so, dass es sich um eine normale Datenbank handelt:

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

  2. Jetzt können wir es fallen lassen:

    DROP DATABASE template1;

  3. Jetzt ist es an der Zeit, eine Datenbank aus template0 mit einer neuen Standardcodierung zu erstellen:

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

  4. Ändern Sie nun template1 so, dass es sich tatsächlich um eine Vorlage handelt:

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

  5. Wechseln Sie nun zu template1 und VACUUM FREEZE die Vorlage:

    \c template1

    VACUUM FREEZE;

Problem sollte behoben sein.

219
tokhi

Stellen Sie sicher, dass Sie das richtige Setup in Ihrer database.yml - Datei haben. Sie sollten template0 Verwenden, wie der Fehler vermuten lässt:

test:
  adapter: postgresql
  encoding: unicode
  database: your_db_name
  template: template0
  Host: localhost
  ...
36
mihai

Wenn Sie Debian verwenden, verwendet es bei der Installation des postgresql-Pakets Ihr Standardgebietsschema, um die template1-Datenbank zu erstellen. Wenn Sie Ihr Betriebssystem nicht für die Verwendung von UTF-8 als Standardgebietsschema konfiguriert haben, tritt dieser Fehler auf.

Zusätzlich zu den oben genannten Lösungen können Sie, wenn Sie sich in einer Neuinstallation befinden und keine aktiven Datenbanken haben, das postgresql-Paket entfernen und Ihr Standardgebietsschema auf UTF-8 festlegen. Der Vorteil dieser Methode besteht darin, dass Sie beim zukünftigen Erstellen von Datenbanken keine Gebietsschemainformationen mehr angeben können.

dpkg-reconfigure locales

Wenn Sie das gewünschte Gebietsschema nicht sehen, installieren Sie das Paket locales-all

apt-get install locales-all

Dann entfernen Sie postgresql

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

Dann neu installieren oder noch besser pgrade auf eine neuere Version, die nicht in Debian stable ist .

8
lee

Was mich betrifft, ich ändere einfach die Zeile von database.yml:

encoding: unicode

zu:

encoding: SQL_ASCII

genau das und alles funktioniert.

4
Yakob Ubaidi

Wenn Ihre Postgres-Installation neu ist und Sie noch keine Datenbanken ausgefüllt haben, können Sie das Verzeichnis data entfernen und den Befehl initdb mit dem Flag erneut ausführen, um Datenbanken mit UTF-8 zu erstellen.

Ändern Sie diesen Befehl entsprechend Ihrer Postgres-Installation. Das -E flag gibt an, welche Zeichenkodierung die Standardeinstellung sein soll. Andere Zeichenkodierungen sind aufgeführt hier .

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

Es sollte ein Fehler auftreten und Ihnen mitteilen, dass das Verzeichnis data nicht leer ist. Befolgen Sie die Anweisungen, entfernen Sie das Verzeichnis und führen Sie den Befehl erneut aus. (Oder entfernen Sie das Verzeichnis data, bevor Sie beginnen, aber es ist immer schön, die Anweisungen selbst zu sehen.)

4
littleforest

Ich hatte ein ähnliches Problem. Meine database.yml sah so aus: -

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

Ich habe template: template0 zu den Standardeinstellungen hinzugefügt

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

Und es hat funktioniert

2
Hussain Niazi