Mam więc kilka serwerów Debiana z PostgreSQL. Historycznie te serwery i PostgreSQL były zlokalizowane przy użyciu zestawu znaków Latin 9, a wtedy było dobrze. Teraz musimy poradzić sobie z takimi sprawami, jak polski, grecki czy chiński, więc zmiana staje się coraz większym problemem.
Kiedy próbowałem utworzyć bazę danych UTF8, otrzymałem komunikat:
BŁĄD: kodowanie UTF8 nie pasuje do ustawień narodowych fr_FR Szczegół: Wybrane ustawienie LC_CTYPE wymaga kodowania LATIN9.
Kilka razy przeprowadzałem badania na ten temat z moim starym kumplem Google, a wszystko, co mogłem znaleźć, to zbyt skomplikowane procedury, takie jak aktualizacja Debiana LANG
, rekompilacja PostgreSQL z poprawnym zestawem znaków, edycja wszystkich LC_
zmiennych systemowych i innych niejasnych rozwiązań. Na razie pomijamy ten problem.
Niedawno wróciło, Grecy chcą tego, a Latin 9 nie chce. I kiedy ponownie analizowałem ten problem, jeden ze współpracowników podszedł do mnie i powiedział: „Nie, to proste, patrz”.
Nic nie edytował, nie robił magicznych sztuczek, po prostu wykonał to zapytanie SQL:
CREATE DATABASE my_utf8_db
WITH ENCODING='UTF8'
OWNER=admin
TEMPLATE=template0
LC_COLLATE='C'
LC_CTYPE='C'
CONNECTION LIMIT=-1
TABLESPACE=pg_default;
I działało dobrze.
Właściwie nie wiedziałem o tym LC_CTYPE='C'
i byłem zaskoczony, że tego nie wykorzystałem w pierwszych rozwiązaniach w Google, a nawet w Stack Overflow. Rozejrzałem się i znalazłem tylko wzmiankę w dokumentacji PostgreSQL.
Gdy LC_CTYPE to C lub POSIX, dowolny zestaw znaków jest dozwolony, ale w przypadku innych ustawień LC_CTYPE istnieje tylko jeden zestaw znaków, który będzie działał poprawnie. Ponieważ ustawienie LC_CTYPE jest zamrożone przez initdb, pozorna elastyczność w stosowaniu różnych kodowań w różnych bazach danych klastra jest bardziej teoretyczna niż rzeczywista, z wyjątkiem sytuacji, gdy wybierzesz ustawienia regionalne C lub POSIX (wyłączając w ten sposób rozpoznanie prawdziwych ustawień regionalnych).
Zastanawiałem się więc, czy to jest zbyt łatwe, zbyt idealne, jakie są wady? I trudno mi znaleźć odpowiedź. Więc przychodzę tu pisać:
tl; dr: Jakie są wady używania LC_CTYPE='C'
konkretnej lokalizacji? Czy to źle? Czego powinienem się spodziewać?
źródło
collate "C"
poorder by
. To Ty decydujesz, czy i gdzie Twoja aplikacja tego potrzebuje. Większość aplikacji tak naprawdę nie obchodzi.COLLATE
specyfikator różniący się od bazy danych.W odniesieniu do zaakceptowanej przez Daniela odpowiedzi na temat sortowania przy użyciu sortowania, należy pamiętać, że jeśli korzystasz z PostgreSQL na komputerze Mac, to preferowane sortowanie może nie działać zgodnie z oczekiwaniami z powodu nieodpowiednich ustawień niektórych zestawień na poziomie systemu operacyjnego. Możesz przeczytać więcej o tym problemie tutaj:
http://www.postgresql.org/message-id/[email protected]
To nie jest konkretny problem PostgreSQL, ale raczej problem z domyślną konfiguracją Mac dla ustawień sortowania. Mój obecny system działa pod PostgreSQL 9.3 na OS X El Capitan w wersji 10.11 i cierpi z powodu tego problemu. Mój system zwraca te same wyniki zapytania, niezależnie od tego, czy korzystam z sortowania „fr_FR” czy „en_US”. Na przykład:
Używając sortowania „fr_FR”:
Za pomocą sortowania „en_US”:
W moim systemie ustawienia sortowania (na poziomie systemu operacyjnego) są takie same dla „fr_FR” i „en_US”, jak pokazano w powłoce, uruchamiając diff:
Mamy nadzieję, że te dodatkowe informacje będą pomocne dla każdego, kto czyta ten, korzystający z PostgreSQL na komputerze Mac, który cierpi na ten problem.
źródło