9

我在 Heroku 使用 Basic 数据库计划。这在支持语言环境的 Postgres 9.1 上运行。我在我的应用程序中排序时遇到问题,因为字符 ÅÄÖ 未得到正确处理(在瑞典应该如此)。

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

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

那么,我该如何设置呢?

4

2 回答 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";

更多信息,请参见22.2。PostgreSQL 手册中的排序规则支持

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

如果做不到这一点,您当然可以在 EC2 中运行您自己的 PostgreSQL 实例,并使用您想要的任何自定义设置。这需要投入管理时间,但老实说运行 9.1 非常简单,甚至包括流复制。甚至可能更便宜。缺点是保持数据库运行成为您的问题,而不是 Heroku 操作团队的问题。

于 2012-09-09T03:23:55.043 回答
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
于 2014-09-04T10:31:49.907 回答