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

任何的想法?

Answers:


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并VACUUM FREEZE模板:

    \c template1

    VACUUM FREEZE;

问题应该解决。


1
@tokhi这是有效的解决方案。我对posgresql不太熟悉,但是我唯一的小步骤0:sudo -u postgres psql postgres对于debian或类似的OS。
croonx

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

这很奇怪...它对环境的行为是否相同development
mihai 2013年

3
谁能解释template0和template1之间的区别,以及为什么这样做有效?
杰克

@Jake请参阅postgresql.org/docs/10/static/manage-ag-templatedbs.html –阅读此页后,一切都说得通:-)
Markus

12

如果使用Debian,则在安装postgresql软件包时,它将使用默认语言环境创建template1数据库。如果尚未将操作系统配置为使用UTF-8作为默认语言环境,则会遇到此错误。

除了上述解决方案之外,如果您是新安装的并且没有活动数据库,则可以删除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

安装语言环境后,它像魔术一样工作:)
Daniel Gordi

6

对于我来说,我只是将行从database.yml

encoding: unicode

至:

encoding: SQL_ASCII

就是这样,一切都可行。


2
这比公认的解决方案要好,但是我是新手,所以我可能不知道将unicode更改为SQL_ASCII的影响。
indieNik

1
使用SQL_ASCII不是一个很好的默认值。
道格'18

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它出现之前来。
丹·贝查德
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.