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ć?