2012-09-08 19 views
7

Używam podstawowego planu bazy danych w Heroku. Działa na Postgres 9.1, który obsługuje locale. Mam problemy z sortowaniem w mojej aplikacji, ponieważ znaki ÅĘÖ nie są traktowane prawidłowo (tak jak powinny w Szwecji).Ustaw lokalizację na Heroku Postgres

Ustawienie to LC_COLLATE, które obsługuje porządkowanie ciągów znaków. Problem polega na tym, że nie mogę znaleźć żadnego sposobu na ustawienie tego na Heroku. Utworzone bazy danych uzyskują lc_collate=en_US.UTF-8, ale muszę ustawić ją na sv_SE.UTF-8.

Nie można zmienić tego ustawienia LC_COLLATE, gdy baza danych została utworzona, dlatego nie można jej zmienić za pomocą konsoli psql.

Jak mogę to ustawić?

Odpowiedz

6

Masz rację, że nie można zmienić domyślnego sortowania bazy danych; LC_COLLATE to zmienna środowiskowa ustawiona na serwerach baz danych Heroku, która znajduje się poza kontrolą użytkownika i jest już ustawiona przed utworzeniem bazy danych. Można jednak ustawić domyślnego sortowania dla poszczególnych kolumn:

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

uzyskać więcej informacji, zobacz 22.2. Collation Support w podręczniku PostgreSQL.

Najpierw możesz, ale nie musisz, aby CREATE COLLATION. Dodatkowo wszystko to zależy od serwerów bazy danych Heroku z zainstalowanymi odpowiednimi danymi lokalnymi - chociaż, jeśli nie, prawdopodobnie dobrze byłoby poprosić o ich wdrożenie, ponieważ nikomu to nie zaszkodzi.

W przeciwnym razie można oczywiście uruchomić własne instancje PostgreSQL w EC2 z dowolną konfiguracją niestandardową. To wymagałoby poświęcenia czasu na administrację, ale szczerze mówiąc, uruchomienie 9.1 jest całkiem proste, nawet włączając replikację strumieniową. Może nawet będzie taniej. Wadą jest to, że utrzymywanie działania bazy danych staje się problemem, a nie problemem zespołu Heroku ops.

+0

Wow, to naprawdę denerwujące. PostgreSQL obsługuje ustawianie sortowania na bazach danych za pomocą 'CREATE DATABASE ... LC_CTYPE 'blah' LC_COLLATE 'blah''; jest do bani, że Heroku nie ujawnia tego użytkownikom. –

+0

Dziękuję, wygląda na to, że można zmienić sortowanie kolumn. Najpierw jednak musiałem utworzyć zestawienie. Dzięki. – Linus

+1

Dzięki! Wreszcie. Długo się z tym zmagałem. Dla mnie nie działało tylko z "sv-SE.UTF-8", ale "sv-SE". Korzystanie szyny, zrobiłem zadania natarcia zmienić sortowanie z następującego kodu: ---- przestrzeni nazw: setup zrobić zadanie: heroku_collation =>: środowisko zrobić ActiveRecord :: Base.establish_connection ActiveRecord :: Base. connection.execute "ALTER TABLE gminy ALTER COLUMN nazwa TYPE varchar COLLATE" sv_SE "; ' koniec koniec –

0

Rozwiązałem to przez utworzenie migracji, która zmienia sortowanie zainteresowanej kolumn (jak sugeruje 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 
Powiązane problemy