web-dev-qa-db-fra.com

PG :: Error: ERROR: le nouveau codage (UTF8) est incompatible

J'ai installé postgresql-9.2.4 de la source, maintenant dans Rails app lorsque j'exécute:

rake db:create commande je reçois:

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

une idée?

76
tokhi

Ok, ci-dessous les étapes ont résolu le problème:

  1. Tout d'abord, nous devons supprimer template1. Les modèles ne peuvent pas être supprimés, nous allons donc d'abord le modifier pour qu'il soit une base de données ordinaire:

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

  2. Maintenant nous pouvons le laisser tomber:

    DROP DATABASE template1;

  3. Il est maintenant temps de créer une base de données à partir de template0, avec un nouveau codage par défaut:

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

  4. Maintenant modifiez template1 pour qu’il s’agisse d’un modèle:

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

  5. Passez maintenant à template1 et VACUUM FREEZE le template:

    \c template1

    VACUUM FREEZE;

Le problème devrait être résolu.

219
tokhi

Assurez-vous que la configuration est correcte dans votre database.yml fichier. Tu devrais utiliser template0, comme le suggère l'erreur:

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

Si vous utilisez Debian, lorsque vous installez le paquet postgresql, il utilisera vos paramètres régionaux par défaut pour créer la base de données template1. Si vous n'avez pas configuré votre système d'exploitation pour utiliser UTF-8 comme paramètres régionaux par défaut, vous rencontrerez cette erreur.

Outre les solutions ci-dessus, si vous êtes sur une nouvelle installation et que vous ne possédez aucune base de données active, vous pouvez supprimer le package postgresql et définir vos paramètres régionaux par défaut sur UTF-8. L'avantage de cette méthode est que vous pouvez omettre les informations sur les paramètres régionaux lors de la création de bases de données.

dpkg-reconfigure locales

Si vous ne voyez pas les paramètres régionaux souhaités, installez le paquet locales-all.

apt-get install locales-all

Puis supprimez postgresql

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

Ensuite, réinstallez ou mieux mise à niveau vers une version récente non stable dans Debian .

8
lee

Quant à moi, je viens de changer la ligne de database.yml:

encoding: unicode

à:

encoding: SQL_ASCII

rien que ça et tout fonctionne.

4
Yakob Ubaidi

Si votre installation postgres est nouvelle et que vous n'avez pas encore rempli de base de données, vous pouvez alors supprimer votre répertoire data et réexécuter la commande initdb avec l'indicateur pour créer des bases de données à l'aide de UTF-8.

Modifiez cette commande pour qu'elle corresponde à votre installation postgres. Le -E flag indique quel codage de caractères doit être le codage par défaut. D'autres encodages de caractères sont listés ici .

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

Il devrait contenir une erreur et vous dire que le répertoire data n'est pas vide. Suivez les instructions et supprimez le répertoire, puis réexécutez la commande. (Ou supprimez le répertoire data avant de commencer, mais il est toujours agréable de voir les instructions par vous-même.)

4
littleforest

J'ai eu un problème similaire. Mon database.yml était comme ça: -

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

J'ai ajouté template: template0 aux paramètres par défaut

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

Et ça a fonctionné

2
Hussain Niazi