2013-05-30 2 views
6

Ich habe eine Tabelle mit Sortierung auf cs_CZ (Tschechisch):PostgreSQL sortiert unsachgemäß Unicode-Zeichen mit tschechischen Sortierungs

Name | Encoding | Collation | CType 
-----------+----------+-------------+------------- 
foo  | UTF8  | cs_CZ.UTF-8 | cs_CZ.UTF-8 

aber wenn ich von String bestellen, wird Ergebnis nicht sortiert, wie es auf Tschechisch Alphabet entsprechend sollte :

=> SELECT surname FROM foo ORDER BY surname; 
    surname  
----------------- 
A 
Da 
Ďb 
Dc 
E 

So ist es sortiert, wie wenn die Unicode-Akzent-Zeichen (D) in der entsprechenden ASCII-Version umgewandelt wurden ohne Akzent (D). Aber das tschechische Alphabet ist: ... C -> D -> Ď -> E ..., also ist die zurückgegebene Reihenfolge falsch (in diesem Beispiel sollte es sein: A -> Da -> Dc -> Ďb -> E).

Ist das übliche PostgreSQL-Verhalten? Gibt es eine Möglichkeit, wie man es korrekt nach dem tschechischen Alphabet sortiert?

EDIT: Versucht auf Postgres 9.1.4, haben beide das gleiche Verhalten. Es ist eine Arch Linux Maschine.
EDIT2: Angepasstes Beispiel, das Ď ist das eigentliche Problem.

+1

Bitte teilen Sie uns mit, welche Version von PostgreSQL Sie verwenden. –

+0

Bist du gerade zufällig auf PostgreSQL 9.1 oder einer neueren Version? Wenn ja, ist die Spalte * Nachname * in Ihrer Tabelle * foo * auf eine andere Sortierung eingestellt? –

+0

Sorry, es ist Postgres 9.1.4 und es ist das gleiche auf 9.2.4. Frage aktualisiert Und nein, es gibt keine spaltenspezifische Sortierung. –

Antwort

4

Es ist richtig. Accent für A, D, E, E, I, N, O, T, U, u, ý ignoriert werden sollte article sehen

Tschechische Sortierregeln wenig komplex sind :)

3

PostgreSQL hat keine eigenen Sortierregeln, es verwendet die Regeln des Betriebssystems. Wenn Sie mit /usr/bin/sort mit demselben Gebietsschema versuchen, erhalten Sie die gleiche Sortierreihenfolge.

Hier ist das Ergebnis mit Ihren Daten Probe, wenn versucht, mit Ubuntu 12.04, PostgreSQL 9.1:

create COLLATION cs_CZ (locale="cs_CZ.UTF-8"); 
select * from (values('Ca'),('Čb'),('Cc')) as l(a) order by a collate cs_CZ; 

Ergebnis:

 
a 
---- 
Ca 
Cc 
Čb 
(3 rows) 

Beachten Sie, dass es sortiert ist, wie Sie sagen, es sollte.

Wenn Ihr Betriebssystem anders sortiert und Sie sind sicher, dass es nach offiziellen tschechischen Regeln falsch ist, dann ist es ein Fehler in seiner tschechischen Gebietsschema-Implementierung.

UPDATE Kommentar folgende:

SELECT * FROM (values('A'),('Da'),('Ďb'),('Dc'),('E')) AS l(a) 
    ORDER BY a COLLATE cs_CZ; 

Ergebnisse in:

 
a 
---- 
A 
Da 
Ďb 
Dc 
E 
+0

Es tut mir leid, durch das Beispiel, das ich verwendete, funktioniert tatsächlich - ich nahm fälschlicherweise an, dass es alle Buchstaben betrifft. Das Problem ist mit dem Buchstaben D (Ď). Könnten Sie bitte das gleiche mit dieser Menge versuchen: '' 'SELECT * FROM (Werte ('A'), ('Da'), ('Ďb'), ('Dc'), ('E')) AS l (a) ORDER BY ein COLLATE cs_CZ; '' '? Was ist das Ergebnis? –

1

in der tschechischen Sortierungs Sortierung ist richtig durch czech grammar rules!

Charaktere wie A, D, E, E, I, N, O, T, U, u, ý sortiert sind wie sie Interpunktion führen nicht so:

A, Da, Ďb, Dc, E entspricht der tschechischen Grammatik.

Für Slowakisch und Tschechisch kann es verrückt klingen, aber "Regeln als Regeln".

Andere Regeln sind für die slowakische Sprache (collate sk_SK), wobei die Buchstaben d-ď, t-ť, n-ň, l-ľ in diesem Fall in alphabetischer Reihenfolge wie tschechisch Ď sind.

Verwandte Themen