92

我已经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"}

任何想法?

4

6 回答 6

249

好的,以下步骤解决了问题:

  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;

问题应该得到解决。

于 2013-05-24T14:48:13.657 回答
46

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

test:
  adapter: postgresql
  encoding: unicode
  database: your_db_name
  template: template0
  host: localhost
  ...
于 2013-05-24T14:15:19.173 回答
13

如果您使用 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 stable 中的最新版本

于 2015-01-24T23:13:54.323 回答
7

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

修改此命令以匹配您的 postgres 安装。该-E标志告诉什么字符编码应该是默认的。此处列出了其他字符编码。

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

它应该出错并告诉您该data目录不为空。按照说明删除目录,然后重新运行命令。(或者,在开始之前删除该data目录,但最好自己查看说明。)

于 2015-06-19T19:49:58.160 回答
4

至于我,我只是将这一行从database.yml

encoding: unicode

至:

encoding: SQL_ASCII

就是这样,一切正常。

于 2018-01-30T11:35:56.553 回答
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'] %>

我将 template: template0 添加到默认设置

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

它奏效了

于 2017-08-09T10:14:46.803 回答