PG ::エラー:エラー:新しいエンコーディング(UTF8)に互換性がありません


84

postgresql-9.2.4ソースからインストールしましたが、実行するとRailsアプリにインストールされます。

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

何か案が?

回答:


229

わかりました、以下の手順で問題が解決しました:

  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に切り替えて、テンプレートをVACUUMFREEZEします。

    \c template1

    VACUUM FREEZE;

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


1
@tokhiこれは実用的なソリューションです。私はposgresqlについてはあまり詳しくありませんが、私の唯一の小さなステップ0:sudo -u postgres psql postgresdebianまたは同様のOSの場合です。
croonx 2016

41

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

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

私は持っていなかったtemplate0私はそれを置くならば、私の設定では、私が得る:PG::Error: ERROR: permission denied to copy database "template0" : CREATE DATABASE "my_database_test" ENCODING = 'unicode' TEMPLATE = "template0"
tokhi

それは奇妙です...それはdevelopmentenvに対して同じように動作しますか?
mihai 2013年

3
template0とtemplate1の違いと、これが機能する理由を誰かが説明できますか?
ジェイク

@Jakeはpostgresql.org/docs/10/static/manage-ag-templatedbs.htmlを参照してください–このページを読んだ後はすべて意味があります:-)
Markus

12

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安定版にない最新リリースにアップグレードします。


2
デフォルトのロケールをen_US.UTF-8に設定し、指示に従ってpostgresを再インストールしましたが、その後も同じエラーが発生しました。
サイモンウッドサイド

サイモンに同意します。なんて時間の無駄:(
karni 2017年

ロケールをインストールした後、それは魔法のように機能しました:)
Daniel Gordi

6

私の場合、行をdatabase.yml次のように変更します。

encoding: unicode

に:

encoding: SQL_ASCII

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


2
これは受け入れられている解決策よりも優れていますが、私はこのようなものに慣れていないので、UnicodeをSQL_ASCIIに変更した場合の影響に気付いていない可能性があります。
indieNik 2018年

1
SQL_ASCIIの使用は、優れたデフォルトではありません。
ダグ

5

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

postgresのインストールに一致するようにこのコマンドを変更します。この-Eフラグは、どの文字エンコードをデフォルトにするかを示します。その他の文字エンコードはここにリストされています

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

エラーが発生し、dataディレクトリが空ではないことが通知されます。指示に従ってディレクトリを削除してから、コマンドを再実行してください。(または、data開始する前にディレクトリを削除しますが、自分で手順を確認することをお勧めします。)


2

同様の問題がありました。私の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 } %>

そしてそれはうまくいった


ああ、順序は重要です!それが思われる前に来template: template0 なければなりませんencoding: unicode
ダンベチャード2017年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.