PG :: Errore: ERRORE: la nuova codifica (UTF8) non è compatibile


84

L'ho installato postgresql-9.2.4dal sorgente, ora nell'app rails quando eseguo:

rake db:create comando che ottengo:

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

qualche idea?

Risposte:


233

Ok, i passaggi seguenti hanno risolto il problema:

  1. Innanzitutto, dobbiamo eliminare template1. I modelli non possono essere rilasciati, quindi prima lo modifichiamo in modo che sia un normale database:

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

  2. Ora possiamo rilasciarlo:

    DROP DATABASE template1;

  3. Ora è il momento di creare il database da template0, con una nuova codifica predefinita:

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

  4. Ora modifica template1 in modo che sia effettivamente un modello:

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

  5. Ora passa a template1 e CONGELA SOTTOVUOTO il modello:

    \c template1

    VACUUM FREEZE;

Il problema dovrebbe essere risolto.


2
@tokhi Questa è una soluzione funzionante. Non ho molta familiarità con posgresql ma il mio unico piccolo passo 0: sudo -u postgres psql postgresper Debian o sistemi operativi simili.
croonx

42

Assicurati di avere la configurazione corretta nel tuo database.ymlfile. Dovresti usare template0, come suggerisce l'errore:

test:
  adapter: postgresql
  encoding: unicode
  database: your_db_name
  template: template0
  host: localhost
  ...

Non avevo template0nella mia configurazione, se la metto ottengo:PG::Error: ERROR: permission denied to copy database "template0" : CREATE DATABASE "my_database_test" ENCODING = 'unicode' TEMPLATE = "template0"
tokhi

è strano ... si comporta lo stesso per l' developmentenv?
mihai

3
Qualcuno potrebbe spiegare la differenza tra template0 e template1 e perché funziona?
Jake

@Jake vedi postgresql.org/docs/10/static/manage-ag-templatedbs.html - tutto ha senso dopo aver letto questa pagina :-)
Markus

12

Se usi Debian, quando installi il pacchetto postgresql userà la tua locale predefinita per creare il database template1. Se non hai configurato il tuo sistema operativo per utilizzare UTF-8 come locale predefinito, incontrerai questo errore.

Oltre alle soluzioni di cui sopra, se stai eseguendo una nuova installazione e non hai database attivi, puoi rimuovere il pacchetto postgresql e impostare la locale predefinita su UTF-8. Il vantaggio di questo metodo è che puoi omettere le informazioni sulle impostazioni locali durante la creazione di database in futuro.

dpkg-reconfigure locales

Se non vedi la lingua desiderata, installa il pacchetto locales-all

apt-get install locales-all

Quindi rimuovere postgresql

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

Quindi reinstallare o, meglio ancora, aggiornare a una versione recente che non è in Debian stabile .


2
Ho impostato la mia locale predefinita su en_US.UTF-8 e ho seguito le tue istruzioni per reinstallare postgres, e dopo ho ancora ricevuto lo stesso errore.
Simon Woodside,

D'accordo con Simon. Che perdita di tempo :(
karni

Dopo aver installato le versioni locali, ha funzionato come per magia :)
Daniel Gordi,

6

Per quanto mi riguarda, cambio solo la riga da database.yml:

encoding: unicode

per:

encoding: SQL_ASCII

solo questo e tutto funziona.


2
Questa è migliore della soluzione accettata, ma sono nuovo a questa roba, quindi potrei non essere a conoscenza degli effetti del cambio di Unicode in SQL_ASCII.
indieNik

1
L'utilizzo di SQL_ASCII non è un'ottima impostazione predefinita.
Doug

5

Se la tua installazione di postgres è nuova e non hai ancora popolato alcun database, puoi rimuovere la tua datadirectory e rieseguire il comando initdb con il flag per creare database usando UTF-8.

Modifica questo comando in modo che corrisponda alla tua installazione di postgres. Il -Eflag indica quale codifica dei caratteri dovrebbe essere l'impostazione predefinita. Altre codifiche dei caratteri sono elencate qui .

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

Dovrebbe essere visualizzato un errore e indicare che la datadirectory non è vuota. Segui le istruzioni e rimuovi la directory, quindi esegui nuovamente il comando. (Oppure rimuovi la datadirectory prima di iniziare, ma è sempre bello vedere le istruzioni da solo.)


2

Ho avuto un problema simile. Il mio database.yml era così: -

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

Ho aggiunto template: template0 alle impostazioni predefinite

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

E ha funzionato


Ah, l'ordine è importante! template: template0 DEVE venire prima encoding: unicodeche sembri.
Dan Bechard
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.