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
好的,下面的步骤解决了问题:
首先,我们需要删除template1.模板不能被删除,所以我们首先修改它,所以这是一个普通的数据库:
UPDATE pg_database SET datistemplate = FALSE WHERE datname = 'template1';
现在我们可以放弃它:
DROP DATABASE template1;
现在是时候从template0创建数据库,使用新的默认编码:
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;
问题应该解决.
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)
如果您使用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.
如果您的 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
在开始之前删除该目录,但自己查看说明总是很好的。)
至于我,我只是将行更改为database.yml
:
encoding: unicode
到:
encoding: SQL_ASCII
就这样,一切正常。