我在Heroku使用基本数据库计划。这适用于Postgres 9.1,它支持语言环境。我在我的应用程序中排序存在问题,因为角色ÅÄÖ没有得到妥善处理(正如他们应该在瑞典)。
要设置的设置为LC_COLLATE
,它处理字符串排序。问题是我找不到任何方法在Heroku上设置它。创建的数据库获得lc_collate=en_US.UTF-8
,但我需要将其设置为sv_SE.UTF-8
。
创建数据库时无法更改此LC_COLLATE
设置,因此无法通过psql控制台更改它。
那么,我该如何设置呢?
答案 0 :(得分: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";
有关详细信息,请参阅PostgreSQL手册中的22.2. Collation Support。
您可能首先需要CREATE COLLATION
,也可能不需要{{1}}。此外,所有这些都取决于安装了正确的语言环境数据的Heroku数据库服务器 - 尽管如果它们没有安装,您可能会很好地请求部署,因为它不会伤害任何人。
如果失败了,您当然可以在EC2中运行自己的PostgreSQL实例,无论您想要什么样的自定义设置。这需要投入管理时间,但诚实地运行9.1非常简单,甚至包括流复制。甚至可能更便宜。缺点是保持数据库运行成为你的问题而不是Heroku ops团队的问题。
答案 1 :(得分: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