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"}
任何想法?
好的,下面的步骤解决了这个问题:
-
首先,我们需要放下template1。 模板不能被删除,所以我们先修改它,使其成为一个普通的数据库:
UPDATE pg_database SET datistemplate = FALSE WHERE datname = 'template1';
-
现在我们可以放弃它:
DROP DATABASE template1;
-
现在是从template0创build数据库的时候,使用新的默认编码:
CREATE DATABASE template1 WITH TEMPLATE = template0 ENCODING = 'UNICODE';
-
现在修改template1,所以它实际上是一个模板:
UPDATE pg_database SET datistemplate = TRUE WHERE datname = 'template1';
-
现在切换到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 } %>
它的工作