Also habe ich einige Debian-Server mit PostgreSQL drauf. In der Vergangenheit wurden diese Server und PostgreSQL mit dem lateinischen Zeichensatz 9 lokalisiert, und damals war es in Ordnung. Jetzt müssen wir uns mit Dingen wie Polnisch, Griechisch oder Chinesisch befassen, damit das Ändern zu einem wachsenden Problem wird.
Als ich versuchte, eine UTF8-Datenbank zu erstellen, wurde folgende Meldung angezeigt:
FEHLER: Codierung UTF8 stimmt nicht mit der Ländereinstellung fr_FR überein. Detail: Für die ausgewählte Einstellung LC_CTYPE ist die Codierung LATIN9 erforderlich.
Einige Male habe ich mit meinem alten Freund Google zu diesem Thema recherchiert, und alles, was ich finden konnte, waren einige überkomplizierte Prozeduren wie das Aktualisieren von Debian LANG
, das Neukompilieren von PostgreSQL mit dem richtigen Zeichensatz, das Bearbeiten aller LC_
Systemvariablen und andere obskure Lösungen. Daher lassen wir dieses Problem vorerst beiseite.
Kürzlich kam es wieder zurück, die Griechen wollen das Zeug und Latin 9 will es nicht. Und während ich mich erneut mit diesem Thema beschäftigte, kam ein Kollege auf mich zu und sagte: "Nein, es ist einfach, sieh mal."
Er hat nichts editiert, hat keine Zaubertricks gemacht, er hat nur diese SQL-Abfrage gemacht:
CREATE DATABASE my_utf8_db
WITH ENCODING='UTF8'
OWNER=admin
TEMPLATE=template0
LC_COLLATE='C'
LC_CTYPE='C'
CONNECTION LIMIT=-1
TABLESPACE=pg_default;
Und es hat gut funktioniert.
Ich wusste eigentlich nichts davon LC_CTYPE='C'
und war überrascht, dass dies nicht bei den ersten Lösungen bei Google und sogar bei Stack Overflow der Fall war. Ich habe mich umgesehen und nur in der PostgreSQL-Dokumentation eine Erwähnung gefunden.
Wenn LC_CTYPE C oder POSIX ist, ist jeder Zeichensatz zulässig, aber für andere Einstellungen von LC_CTYPE gibt es nur einen Zeichensatz, der ordnungsgemäß funktioniert. Da die LC_CTYPE-Einstellung von initdb eingefroren wird, ist die offensichtliche Flexibilität, verschiedene Codierungen in verschiedenen Datenbanken eines Clusters zu verwenden, eher theoretisch als real, es sei denn, Sie wählen das Gebietsschema C oder POSIX (wodurch die reale Gebietsschemabe deaktiviert wird).
Ich habe mich gefragt, ob das zu einfach und zu perfekt ist. Was sind die Nachteile? Und es fällt mir schwer, eine Antwort zu finden. Also hier komme ich hier posten:
tl; dr: Was sind die Nachteile LC_CTYPE='C'
einer bestimmten Lokalisierung? Ist es schlimm das zu tun? Was soll ich erwarten, um zu brechen?