在Heroku的PostgreSQL上设置语言环境

9
我正在使用Heroku的基础数据库计划。该计划使用支持本地化的Postgres 9.1。我的应用程序在排序方面出现了问题,因为 ÅÄÖ 这些字符没有按照瑞典的要求进行处理。
需要设置的选项是 LC_COLLATE,它处理字符串的排序。问题是我找不到任何方法在Heroku上进行这个设置。创建的数据库默认为 lc_collate=en_US.UTF-8,但我需要将其设置为 sv_SE.UTF-8。
由于无法更改已创建的数据库的此 LC_COLLATE 设置,因此我无法通过psql控制台更改它。
那么,我该如何设置呢?
2个回答

7

您说得对,无法更改数据库的默认排序规则;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.排序支持

您可能需要先CREATE COLLATION。此外,所有这些都取决于Heroku数据库服务器安装了适当的区域设置数据——尽管如果他们没有,你可能可以礼貌地要求部署它,因为它不会伤害任何人。

如果无法实现上述方法,您当然可以在EC2上运行自己的PostgreSQL实例,并使用您想要的任何自定义设置。这将需要投入管理时间,但是老实说,即使包括流复制,运行9.1也相当简单。甚至可能更便宜。缺点是保持数据库运行成为您的问题,而不是Heroku运维团队的问题。


哇,那真的很烦人。PostgreSQL支持通过CREATE DATABASE ... LC_CTYPE 'blah' LC_COLLATE 'blah'设置每个数据库排序规则;令人遗憾的是 Heroku 并没有向用户公开此功能。 - Craig Ringer
谢谢,似乎更改列排序规则是有效的。但我确实需要先创建排序规则。感谢。 - Linus
1
谢谢!终于解决了。我已经苦苦挣扎太久了。 对我来说,使用"sv-SE.UTF-8"无效,只能用"sv-SE"。

使用Rails,我编写了一个rake任务来改变排序规则,代码如下:

namespace :setup do task :heroku_collation => :environment do ActiveRecord::Base.establish_connection ActiveRecord::Base.connection.execute 'ALTER TABLE municipalities ALTER COLUMN name TYPE varchar COLLATE "sv_SE";' end end
- Stefan Pettersson

1
我通过创建一个修改相关列排序规则的迁移来解决了这个问题(就像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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接