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

tok*_*khi 77 ruby postgresql ruby-on-rails

postgresql-9.2.4从源代码安装,现在在执行时使用rails app:

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"}
Run Code Online (Sandbox Code Playgroud)

任何的想法?

tok*_*khi 223

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

  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;

问题应该解决.

  • @tokhi 这是有效的解决方案。我对 posgresql 不太熟悉,但我对 debian 或类似操作系统的唯一小步骤 0:`sudo -u postgres psql postgres`。 (2认同)

mih*_*hai 38

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

test:
  adapter: postgresql
  encoding: unicode
  database: your_db_name
  template: template0
  host: localhost
  ...
Run Code Online (Sandbox Code Playgroud)

  • 谁能解释一下template0和template1之间的区别以及为什么会这样? (3认同)

lee*_*lee 9

如果您使用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.

  • 我将我的默认语言环境设置为en_US.UTF-8并按照您的说明重新安装postgres,之后仍然出现相同的错误. (2认同)

lit*_*est 6

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

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

/usr/local/pgsql/bin/initdb -E UTF8 -D /usr/local/pgsql/data -U postgres
Run Code Online (Sandbox Code Playgroud)

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


Yak*_*idi 5

至于我,我只是将行更改为database.yml

encoding: unicode

到:

encoding: SQL_ASCII

就这样,一切正常。

  • 这比公认的解决方案要好,但我对这个东西很陌生,所以我可能不知道将 unicode 更改为 SQL_ASCII 的影响。 (2认同)
  • 使用 SQL_ASCII 不是一个很好的默认设置。 (2认同)
  • 这意味着非英语语言、法语口音、甚至包括 C 度符号使用的任何特殊字符都将无法存储。在当今时代这不是一个好主意。 (2认同)