web-dev-qa-db-ja.com

PG ::エラー:エラー:新しいエンコード(UTF8)は互換性がありません

ソースからpostgresql-9.2.4をインストールしました。実行するとRails app:

rake db:createコマンド:

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

何か案が?

76
tokhi

OK、以下の手順で問題を解決しました:

  1. まず、template1をドロップする必要があります。テンプレートはドロップできないため、まず通常のデータベースになるように変更します。

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

  2. これでドロップできます:

    DROP DATABASE template1;

  3. ここで、新しいデフォルトのエンコーディングを使用して、template0からデータベースを作成します。

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

  4. 次に、実際にテンプレートになるようにtemplate1を変更します。

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

  5. 次にtemplate1に切り替えて、テンプレートをVACUUM FREEZEします:

    \c template1

    VACUUM FREEZE;

問題を解決する必要があります。

219
tokhi

database.ymlファイルに正しい設定があることを確認してください。エラーが示唆するように、template0を使用する必要があります。

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

Debianを使用している場合、postgresqlパッケージをインストールすると、デフォルトのロケールを使用してtemplate1データベースが作成されます。デフォルトロケールとしてUTF-8を使用するようにOSを設定していない場合、このエラーが発生します。

上記のソリューションに加えて、新規インストールでアクティブなデータベースがない場合は、postgresqlパッケージを削除してデフォルトロケールをUTF-8に設定できます。この方法の利点は、将来データベースを作成するときにロケール情報を省略できることです。

dpkg-reconfigure locales

目的のロケールが表示されない場合は、locales-allパッケージをインストールしてください

apt-get install locales-all

その後、postgresqlを削除します

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

その後、再インストールするか、さらに良い Debian安定版ではない最近のリリースにアップグレードする

8
lee

私に関しては、行をdatabase.yml

encoding: unicode

に:

encoding: SQL_ASCII

それだけですべてが機能します。

4
Yakob Ubaidi

Postgresのインストールが新しく、まだデータベースを設定していない場合は、dataディレクトリを削除し、フラグを付けてinitdbコマンドを再実行して、UTF-8を使用してデータベースを作成できます。

Postgresのインストールに合わせてこのコマンドを変更します。 -Eフラグは、どの文字エンコードをデフォルトにするかを指示します。他の文字エンコーディングがリストされています here

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

エラーが発生し、dataディレクトリが空ではないことがわかります。指示に従ってディレクトリを削除し、コマンドを再実行します。 (または、開始する前にdataディレクトリを削除しますが、自分自身の指示を見るのは常に素晴らしいことです。)

4
littleforest

同様の問題がありました。私のdatabase.ymlはこのようなものでした:

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

テンプレート:template0をデフォルト設定に追加しました

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

そしてそれは働いた

2
Hussain Niazi