我正在尝试使用以下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?
发布于 2013-07-02 23:44:41
首先,您需要提供程序版本。
接下来,您需要了解默认区域设置LC_CTYPE是在集群创建时确定的。I quote the manual here
创建数据库时,某些区域设置类别的值必须是固定的。您可以对不同的数据库使用不同的设置,但是一旦创建了数据库,就不能再为该数据库更改这些设置。
LC_COLLATE和LC_CTYPE就是这些类别。它们会影响索引的排序顺序,因此必须保持固定,否则文本列上的索引可能会损坏。(但您可以使用排序规则来减轻此限制,如第22.2节所述。)这些类别的默认值是在运行initdb时确定的,除非在CREATE DATABASE命令中另有指定,否则在创建新数据库时将使用这些值。
使用在template0模板数据库上构建的CREATE DATABASE可以很容易地解决这个问题,因为模板数据库中没有预先确定的对象。
CREATE DATABASE pana_development ENCODING 'LATIN1' TEMPLATE template0;在Ruby中,你可以只提供一个"template“参数:
template: template0比较一下这个密切相关的答案:
rake db:create encoding error with postgresql
为了重复使用,你应该准备一个如上所述的数据库,把你想要的所有东西都放到未来的数据库中,并使用这个作为模板。任何数据库都可以用作模板。
或者您使用匹配的LC_TYPE创建一个新的数据库集群,并从那里获取它。
发布于 2014-04-08 17:09:19
我在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';您可以获取原始源here
https://stackoverflow.com/questions/17429732
复制相似问题