PG :: Error: ERROR: la nueva codificación (UTF8) es incompatible

84

Lo instalé postgresql-9.2.4desde la fuente, ahora en la aplicación rails cuando ejecuto:

rake db:create comando que obtengo:

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

¿alguna idea?

tokhi
fuente

Respuestas:

229

Ok, los siguientes pasos resolvieron el problema:

  1. Primero, necesitamos eliminar template1. Las plantillas no se pueden eliminar, por lo que primero las modificamos para que sea una base de datos normal:

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

  2. Ahora podemos dejarlo:

    DROP DATABASE template1;

  3. Ahora es el momento de crear una base de datos a partir de template0, con una nueva codificación predeterminada:

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

  4. Ahora modifique template1 para que en realidad sea una plantilla:

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

  5. Ahora cambie a la plantilla 1 y VACÍO CONGELE la plantilla:

    \c template1

    VACUUM FREEZE;

El problema debe resolverse.

tokhi
fuente
1
@tokhi Esta es una solución de trabajo. No estoy muy familiarizado con posgresql, pero mi único pequeño paso 0: sudo -u postgres psql postgrespara debian o un sistema operativo similar.
croonx
41

Asegúrese de tener la configuración correcta en su database.ymlarchivo. Debe usar template0, como sugiere el error:

test:
  adapter: postgresql
  encoding: unicode
  database: your_db_name
  template: template0
  host: localhost
  ...
mihai
fuente
No lo tenía template0en mi configuración, si lo PG::Error: ERROR: permission denied to copy database "template0" : CREATE DATABASE "my_database_test" ENCODING = 'unicode' TEMPLATE = "template0"
coloco
eso es extraño ... ¿se comporta igual para el developmentenv?
mihai
3
¿Alguien podría explicar la diferencia entre template0 y template1 y por qué funciona?
Jake
@Jake ver postgresql.org/docs/10/static/manage-ag-templatedbs.html - todo tiene sentido después de leer esta página :-)
Markus
12

Si usa Debian, cuando instale el paquete postgresql, usará su configuración regional predeterminada para crear la base de datos template1. Si no ha configurado su sistema operativo para usar UTF-8 como configuración regional predeterminada, encontrará este error.

Además de las soluciones anteriores, si se encuentra en una nueva instalación y no tiene bases de datos activas, puede eliminar el paquete postgresql y establecer su configuración regional predeterminada en UTF-8. La ventaja de este método es que puede omitir la información de la configuración regional cuando cree bases de datos en el futuro.

dpkg-reconfigure locales

Si no ve la configuración regional deseada, instale el paquete locales-all

apt-get install locales-all

Luego elimine postgresql

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

Luego reinstale o mejor aún actualice a una versión reciente que no esté en Debian estable .

sotavento
fuente
2
Configuré mi configuración regional predeterminada en en_US.UTF-8 y seguí sus instrucciones para reinstalar postgres, y seguí recibiendo el mismo error después.
Simon Woodside
De acuerdo con Simon. Qué pérdida de tiempo :(
karni
Después de instalar las configuraciones regionales, funcionó como por arte de magia :)
Daniel Gordi
6

En cuanto a mí, solo cambio la línea de database.yml:

encoding: unicode

a:

encoding: SQL_ASCII

solo eso y todo funciona.

Yakob Ubaidi
fuente
2
Esto es mejor que la solución aceptada, pero soy nuevo en esto, por lo que es posible que no esté al tanto de los efectos de cambiar unicode a SQL_ASCII.
indieNik
1
Usar SQL_ASCII no es un gran valor predeterminado.
Doug
5

Si su instalación de postgres es nueva y aún no ha llenado ninguna base de datos, puede eliminar su datadirectorio y volver a ejecutar el comando initdb con la bandera para crear bases de datos usando UTF-8.

Modifique este comando para que coincida con su instalación de postgres. La -Ebandera indica qué codificación de caracteres debería ser la predeterminada. Aquí se enumeran otras codificaciones de caracteres .

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

Debería producirse un error y decirle que el datadirectorio no está vacío. Siga las instrucciones y elimine el directorio, luego vuelva a ejecutar el comando. (O elimine el datadirectorio antes de comenzar, pero siempre es bueno ver las instrucciones usted mismo).

pequeño bosque
fuente
2

Tuve un problema similar. Mi database.yml era así: -

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

Agregué template: template0 a la configuración predeterminada

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

Y funcionó

Hussain Niazi
fuente
¡Ah, el orden es importante! template: template0 DEBE venir antes de encoding: unicodeque parezca.
Dan Bechard