2012-09-08 106 views
7

我在Heroku中使用基础数据库计划。它运行在支持语言环境的Postgres 9.1上。我在我的应用程序中排序时遇到问题,因为ÅÄÖ字符没有得到妥善处理(就像他们在瑞典应该那样)。在Heroku上设置语言环境postgres

要设置的设置是LC_COLLATE,它处理字符串排序。问题是我找不到在Heroku上设置它的任何方法。创建的数据库得到lc_collate=en_US.UTF-8,但我需要将其设置为sv_SE.UTF-8

这个LC_COLLATE设置在创建数据库时无法更改,因此我无法通过psql控制台更改它。

那么,我该如何设置呢?

回答

6

你是正确的,不能改变数据库的默认排序规则; LC_COLLATE是在Heroku数据库服务器上设置的一个环境变量,它在您的控制之外并且在数据库创建之前已经设置。你可以,但是,对于各列设置的默认排序:

CREATE TABLE new_table (
    foo varchar COLLATE "sv_SE.UTF-8", 
    bar varchar COLLATE "sv_SE.UTF-8" 
); 

ALTER TABLE existing_table ALTER COLUMN baz TYPE varchar COLLATE "sv_SE.UTF-8"; 

有关详细信息,请参阅22.2. Collation Support PostgreSQL的手册。

您可能首先需要也可能不需要CREATE COLLATION。另外,所有这一切都取决于Heroku数据库服务器安装了正确的语言环境数据 - 尽管如果他们不这样做,您可能会很好地请求部署,因为它不会伤害任何人。

如果失败了,你当然可以在EC2中运行你自己的PostgreSQL实例,无论你想要什么样的自定义设置。这需要投入管理时间,但老实说,运行9.1非常简单,甚至包括流式复制。甚至可能会更便宜。缺点是保持数据库运行成为你的问题,而不是Heroku操作团队的问题。

+0

哇,真烦。 PostgreSQL支持通过CREATE DATABASE ... LC_CTYPE'blah'LC_COLLATE'blah''设置每个数据库的排序规则;它吸引了Heroku不会向用户公开这一点。 –

+0

谢谢,它似乎可以改变列整理。我确实需要首先创建排序规则。谢谢。 – Linus

+1

谢谢!最后。我一直在苦苦挣扎,这太久了。 对我来说,它不适用于“sv-SE.UTF-8”,而只适用于“sv-SE”。 使用Rails,我做了一个rake任务改变与下面的代码整理: ---- 命名空间:设置做 任务:heroku_collat​​ion =>:环境做 的ActiveRecord :: Base.establish_connection 的ActiveRecord :: Base的。 connection.execute'ALTER TABLE municipalities ALTER COLUMN name TYPE varchar COLLATE“sv_SE”;'结束 结束 –

0

我解决了这个通过创建改变有关列的排序规则(如willglyn建议)迁移:

class SetSwedishCollationForStores < ActiveRecord::Migration 
    def up 
    execute 'ALTER TABLE stores ALTER COLUMN city TYPE varchar COLLATE "sv_SE";' 
    execute 'ALTER TABLE stores ALTER COLUMN title TYPE varchar COLLATE "sv_SE";' 
    end 
end