1

我正在尝试使用以下 database.yml 将我的 rails 应用程序设置为使用 latin1 编码

development:
adapter: postgresql
database: pana_development
pool: 5
timeout: 5000
encoding: latin1

运行时rake db:create出现以下错误:

Couldn't create database for {"adapter"=>"postgresql", "database"=>"pana_development",    "pool"=>5, "timeout"=>5000, "encoding"=>"latin1"}
PG::Error: ERROR:  encoding LATIN1 does not match locale en_US.UTF-8
DETAIL:  The chosen LC_CTYPE setting requires encoding UTF8.

为了在 postgresql 数据库中使用 latin1 编码设置 rails,我需要做什么?

4

2 回答 2

2

我在 Gist 中找到了一个脚本,它的作用就像一个魅力

sudo su postgres

psql

update pg_database set datistemplate=false where datname='template1';
drop database Template1;
create database template1 with owner=postgres encoding='UTF-8'
  lc_collate='en_US.utf8' lc_ctype='en_US.utf8' template template0;

update pg_database set datistemplate=true where datname='template1';

您可以在此处获取原始来源

于 2014-04-08T09:09:19.147 回答
1

首先,您需要提供程序版本。
接下来,您需要了解默认语言环境设置LC_CTYPE是在集群创建时确定的。我在这里引用手册

创建数据库时,某些语言环境类别的值必须固定。您可以对不同的数据库使用不同的设置,但是一旦创建了数据库,就不能再为该数据库更改它们。LC_COLLATE并且LC_CTYPE是这些类别。它们会影响索引的排序顺序,因此它们必须保持固定,否则文本列上的索引会损坏。(但是您可以使用排序规则来缓解这种限制,如第 22.2 节所述。)这些类别的默认值是在运行 initdb 时确定的,并且在创建新数据库时使用这些值,除非在CREATE DATABASE命令中另有指定。

CREATE DATABASE您可以通过构建模板数据库轻松解决此问题,该template0数据库中没有预先确定的对象。

CREATE DATABASE pana_development ENCODING 'LATIN1' TEMPLATE template0;

在 Ruby 中,您可以只提供一个“模板”参数:

template: template0

比较这个密切相关的答案:
rake db:create encoding error with postgresql

对于重复使用,您应该准备一个如上所述的数据库,将您想要在未来数据库中的所有内容放入其中,并将此用作模板。任何数据库都可以用作模板。

或者您创建一个具有匹配项的新数据库集群LC_TYPE并从那里获取它。

于 2013-07-02T15:44:41.443 回答