PG ::错误:错误:新编码(UTF8)不兼容

我已经从源安装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"} 

任何想法?

好的,下面的步骤解决了这个问题:

  1. 首先,我们需要放下template1。 模板不能被删除,所以我们先修改它,使其成为一个普通的数据库:

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

  2. 现在我们可以放弃它:

    DROP DATABASE template1;

  3. 现在是从template0创build数据库的时候,使用新的默认编码:

    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;

问题应该解决。

确保你的database.yml文件中有正确的设置。 你应该使用template0 ,正如错误所示:

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

如果您使用Debian,那么当您安装postgresql包时,它将使用您的默认语言环境来创buildtemplate1数据库。 如果您没有将操作系统configuration为使用UTF-8作为默认语言环境,则会遇到此错误。

除上述解决scheme之外,如果您正在进行新安装并且没有活动的数据库,则可以删除postgresql软件包,并将您的缺省语言环境设置为UTF-8。 这种方法的优点是可以在将来创build数据库时省略区域信息。

dpkg-reconfigure locales

如果看不到所需的语言环境,请安装locales-all软件包

apt-get install locales-all

然后删除postgresql

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

然后重新安装或更好的升级到最新版本,而不是在Debian稳定 。

如果你的postgres安装是新的,你还没有填充任何数据库,那么你可以删除你的data目录并重新运行带有标志的initdb命令来使用UTF-8创build数据库。

修改这个命令来匹配你的postgres安装。 -E标志指示什么字符编码应该是默认的。 其他字符编码在这里列出。

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

它应该错误,并告诉你, data目录不是空的。 按照说明并删除目录,然后重新运行该命令。 (或者,在开始之前删除data目录,但总是很高兴看到自己的说明。)

我有一个类似的问题。 我的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'] %> 

我添加了template:template0为默认设置

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

它的工作