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?
quelle
collate "C"
nach dem macheorder by
. Sie bestimmen, ob und wo Ihre Anwendung dies benötigt. Die meisten Anwendungen interessieren sich nicht wirklich dafür.COLLATE
Bezeichner haben, der sich von dem der Datenbank unterscheidet.Beachten Sie in Bezug auf Daniels akzeptierte Antwort zum Sortieren anhand von Kollatierungen, dass PostgreSQL auf einem Mac möglicherweise nicht wie erwartet funktioniert, da für einige Kollatierungen auf Betriebssystemebene keine ausreichenden Einstellungen vorgenommen wurden. Sie können hier mehr über das Problem lesen:
http://www.postgresql.org/message-id/[email protected]
Dies ist kein spezielles PostgreSQL-Problem, sondern ein Problem mit der Standardkonfiguration von Mac für Sortierungseinstellungen. Auf meinem aktuellen System wird PostgreSQL 9.3 unter OS X El Capitan Version 10.11 ausgeführt und dieses Problem tritt auf. Mein System gibt die gleichen Abfrageergebnisse zurück, unabhängig davon, ob ich die Kollatierung "fr_FR" oder "en_US" verwende. Beispielsweise:
Verwenden der Kollatierung "fr_FR":
Verwenden der Kollatierung "en_US":
Auf meinem System sind die Sortierungseinstellungen (auf Betriebssystemebene) für "fr_FR" und "en_US" dieselben, wie in der Shell durch Ausführen von diff gezeigt:
Hoffentlich sind diese zusätzlichen Informationen hilfreich für alle, die dies lesen und PostgreSQL auf einem Mac verwenden, der unter diesem Problem leidet.
quelle