2012-09-08 19 views
7

Ich benutze den Basis-Datenbankplan bei Heroku. Dies läuft auf Postgres 9.1, die Unterstützung für Locales hat. Ich habe Probleme mit der Sortierung in meiner App, weil die Zeichen ÅÄÖ nicht richtig behandelt werden (wie es in Schweden der Fall ist).Set locale auf Heroku postgres

Die einzustellende Einstellung ist LC_COLLATE, die die String-Reihenfolge behandelt. Das Problem ist, dass ich keine Möglichkeit finde, dies auf Heroku einzustellen. Die Datenbanken, die erstellt werden, erhalten lc_collate=en_US.UTF-8, aber ich muss es auf sv_SE.UTF-8 setzen.

Diese LC_COLLATE Einstellung kann nicht geändert werden, wenn die Datenbank erstellt wurde, daher kann ich sie nicht über die psql-Konsole ändern.

Also, wie kann ich das einstellen?

Antwort

6

Sie haben Recht, dass die Standardsortierung der Datenbank nicht geändert werden kann; LC_COLLATE ist eine Umgebungsvariable, die auf den Heroku-Datenbankservern festgelegt ist. Diese Umgebungsvariable befindet sich sowohl außerhalb Ihrer Kontrolle als auch bereits vor der Erstellung Ihrer Datenbank. Sie können jedoch, stellen Sie die Standardsortierung für einzelne Spalten:

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

Weitere Informationen finden sich 22.2. Collation Support in der PostgreSQL-Handbuch.

Sie müssen oder müssen möglicherweise zuerst CREATE COLLATION nicht. Darüber hinaus hängt alles davon ab, dass auf den Heroku-Datenbankservern die richtigen Länderdaten installiert sind. Wenn dies jedoch nicht der Fall ist, könnten Sie wahrscheinlich freundlich darum bitten, dass diese bereitgestellt werden, da dies niemanden verletzen würde.

Andernfalls können Sie natürlich Ihre eigenen PostgreSQL-Instanzen in EC2 mit den von Ihnen gewünschten benutzerdefinierten Einstellungen ausführen. Das würde erfordern, Verwaltungszeit zu investieren, aber ehrlich gesagt ist das Ausführen von 9.1 ziemlich einfach, sogar einschließlich Streaming-Replikation. Vielleicht sogar billiger. Der Nachteil ist, dass das Laufenlassen der Datenbank zu Ihrem Problem wird und nicht zu einem Problem für das Team von Heroku.

+0

Wow, das ist wirklich ärgerlich ist. PostgreSQL unterstützt die Einstellung von Sortierungen pro Datenbank über 'CREATE DATABASE ... LC_CTYPE 'blah' LC_COLLATE 'blah''; Es ist nervig, dass Heroku das nicht den Benutzern aussetzt. –

+0

Danke, es scheint zu funktionieren, um die Spaltensortierung zu ändern. Ich musste allerdings zuerst die Kollatierung erstellen. Vielen Dank. – Linus

+1

Danke! Endlich. Ich habe mich damit zu lange herumgeschlagen. Für mich funktionierte das nicht mit "sv-SE.UTF-8", sondern nur mit "sv-SE". Mit Schienen, machte ich eine Harke Aufgabe die Sortierung mit folgenden Code zu ändern: ---- Namespace: setup tun Aufgabe: heroku_collation =>: Umwelt tun Active :: Base.establish_connection Activerecord :: Base. connection.execute 'ALTER TABLE Gemeinden ALTER COLUMN Name TYPE varchar COLLATE "sv_SE";' Ende Ende –

0

Ich löste dies durch eine Migration zu schaffen, um die Sortierung der betroffenen Spalten verändert (wie willglyn schon sagt):

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 
Verwandte Themen