2012-09-08 19 views
7

私はHerokuでBasicデータベースプランを使用しています。これは、ロケールをサポートしている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データベースサーバーで設定された環境変数です.Herokuデータベースサーバーは、データベースの作成前にコントロールの外にあり、既に設定されています。 PostgreSQLのマニュアルの22.2. Collation Supportを参照して、より多くの場合

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"; 

:あなたは、しかし、個々の列のデフォルトの照合順序を設定することができます。

最初に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」でしか動作しませんでした。 のActiveRecord :: Base.establish_connection はActiveRecord ::ベースを行う環境:heroku_collat​​ion =>: 作業を行うセットアップ: ---- 名前空間: 使用して、レールには、私は次のコードとの照合を変更するにはrakeタスクを作りました。 connection.execute 'ALTER TABLE地方自治体ALTER COLUMN名前型varchar COLLATE "sv_SE";' end end –

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 
関連する問題