2016-09-13 21 views
1

Wie genau ist eine, um alle Sprachen in Postgres utf8 Zeichensatz nahtlos unterstützt unterstützt? Es scheint, als müssten wir eine einzige sprachspezifische Sortierung zusammen mit dem Zeichensatz angeben, z. B. en_US.utf8. Wenn ich mich nicht irre, haben wir nicht die Möglichkeit, sowohl Englisch() als auch Chinesisch (zh_CN) in der gleichen utf8 Spalte zu speichern, während eine beliebige Art von sinnvollem Kollationsverhalten beibehalten wird. Wenn ich eine Spalte wie en_US.utf8 definiere, wie soll sie mit Werten umgehen, die chinesische (zh_CN) Zeichen/Bytefolgen enthalten? Die Realität ist, dass ein einzelner Spaltenwert mehrere Sprachen enthalten kann (z. B. "Hello und 晚安") und einfach nicht in einer Sprache zusammengefasst werden kann.Mehrere Sprachen mit utf8 in postgresql

Ja, ich kann beliebige Zeichenfolgen speichern; aber was ist das definierte Verhalten für die Bestellung auf einer en_US.utf8 Spalte, die englische, deutsche, chinesische, japanische und koreanische Strings enthält?

Ich verstehe, dass Mysql utf8mb4_unicode_ci Kollation ist nicht perfekt, und dass es keine festgelegten Standard für das Sortieren der gesamten Unicode-Set folgt. Ich kann schon die Anti-Mysql-Menge hören, die darüber seufzt, wie mysqls sprachunabhängige Kollatierungen willkürlich, semantisch bedeutungslos oder sogar rein ungültig sind. Aber Tatsache ist, es funktioniert gut genug, und erfüllt die Erwartung, dass utf8 = mehrsprachige Unicode-Unterstützung.

Ist Postgres nur extrem stur mit der Tatsache, dass es semantisch falsch ist, über das Unicode-Spektrum zu sammeln? Ich weiß, dass die Entwickler sehr streng sind, wenn es darum geht, "Dinge entsprechend der Spezifikation zu tun", aber diese Unfähigkeit, mehrere Sprachen zu jonglieren, ist gelinde gesagt frustrierend. Fehle ich etwas, das das mehrsprachige Problem löst, oder ist die offizielle Meinung, dass eine einzelne Spalte mit jeder Sprache umgehen kann, aber nur eine Sprache gleichzeitig?

+1

"* aber was ist das definierte Verhalten für die Sortierung in einer Spalte, die englische, deutsche, chinesische, japanische und koreanische Strings * enthält" - einfach gesagt: das geht nicht. Leider ist die Sortierungsunterstützung nicht der stärkste Bereich von Postgres, und der Operator 'ORDER BY' erlaubt es nicht, eine Sortierung für die Sortierung anzugeben, die der richtige Weg wäre, wenn Sie nur eine einzige Sprache auswählen würden. Obwohl es den _content_ in mehreren Sprachen recht einfach handhaben kann, kann es die Sortierung nicht handhaben, das ist richtig. –

+0

Sie könnten immer versuchen 'collate =" C "' - nicht sicher, wie gut das mit UTF8 funktioniert, obwohl –

Antwort

2

Sie haben Recht, dass es nie eine perfekte Möglichkeit geben wird, Strings über Sprachen hinweg zu sortieren.

PostgreSQL hat beschlossen, keine eigenen Kollatierungen zu erstellen, sondern die vom Betriebssystem bereitgestellten zu verwenden. Die Idee dahinter ist, das Rad nicht neu zu erfinden und den Wartungsaufwand zu reduzieren.
Die traditionelle PostgreSQL-Antwort auf Ihre Frage wäre also: Wenn Sie eine String-Sortierung für Strings in verschiedenen Sprachen verwenden möchten, wenden Sie sich an Ihren Betriebssystemanbieter oder wählen Sie ein Betriebssystem mit einer solchen Sortierung.

Jedoch hat dieser Ansatz Nachteile, die die PostgreSQL-Gemeinschaft bewusst ist:

  • Wenige –, wenn irgendwelche – Menschen auf einem Betriebssystem entscheiden, basierend auf dem Vergleich Unterstützung, die es zur Verfügung stellt.

  • PostgreSQLs Sortierverhalten hängt vom zugrunde liegenden Betriebssystem ab, was zu häufigen Fragen verwirrter Benutzer auf den Mailinglisten führt.

  • Bei einigen Betriebssystemen kann sich das Kollationsverhalten während eines Betriebssystem-Upgrades ändern, was zu beschädigten Datenbankindizes führt (siehe zum Beispiel this thread).

Es kann gut sein, dass PostgreSQL seinen Ansatz ändert; Es gab wiederholte Bemühungen, ICU Bibliotheken anstelle von Betriebssystem-Kollatierungen zu verwenden (siehe zum Beispiel this recent thread), die einige dieser Probleme mildern würden.

+0

Vielen Dank, sehr informativ. Wie unglücklich. Ich habe darauf gewartet, auf pg für ein echtes Projekt zu springen, da die Replikation zum Core in 9.0 hinzugefügt wurde. Ich muss mein gesamtes Projekt planen, um zu sehen, ob ich leben kann, ohne jemals die von Benutzern bereitgestellten utf8-Strings zu sortieren. Sie erwähnen Betriebssysteme mit integrierten Sortierfolgen, die dieses Szenario bewältigen können. Aufgrund Ihrer Links scheint CentOS einer von ihnen zu sein? Nach welchen Begriffen sollte ich suchen, um zu erfahren, welche Betriebssysteme dieses Setup unterstützen und wie ich das Betriebssystem konfigurieren würde? –

+0

CentOS ist ein RedHat-Klon, oder? Ich könnte die Ergebnisse mit RedHat Linux reproduzieren, und die Komponente, die Collation-Unterstützung bietet, ist glibc. Gibt es Linuxen, die glibc nicht verwenden? Ich würde erwarten, dass es für dieses Problem nicht wirklich wichtig ist, welche Linux-Distribution Sie verwenden. Ich würde Strings in verschiedenen Sprachen mit dem Befehl 'sort' testen. Das verwendet OS-Kollatierungen, und auf diese Weise können Sie testen, ob die Sortierreihenfolge für Sie funktioniert. –

Verwandte Themen