2013-05-30 8 views
6

Mam tabeli z sortowaniem ustawiony cs_CZ (Czech):PostgreSQL niewłaściwie sortuje unicode znaki z Czech zestawień

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

ale kiedy zamówić przez ciąg, wynik nie jest klasyfikowane jako należy według czeskiego alfabetu :

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

Więc to jest klasyfikowane jak gdyby znak Unicode akcent (d) przekształcono w wersji ASCII bez akcentu (D). Ale alfabet czeski to: ... C -> D -> Ď -> E ..., więc zwrócona kolejność jest niepoprawna (w tym przykładzie powinno być: A -> Da -> Dc -> Ďb -> E).

Czy to zwykle zachowanie PostgreSQL? Czy istnieje sposób, w jaki sposób jest poprawnie sortowany według alfabetu czeskiego?

EDYCJA: Próbowano na Postgres 9.1.4, oba mają takie samo zachowanie. Jest to maszyna Arch Linux.
EDIT2: Poprawiony przykład, Ď jest prawdziwym problemem.

+1

Poinformuj nas, której wersji PostgreSQL używasz. –

+0

Czy przypadkiem jesteś na PostgreSQL 9.1 lub nowszej wersji? Jeśli tak, czy kolumna * nazwisko * w tabeli * foo * jest ustawiona na inne sortowanie? –

+0

Niestety, jest to Postgres 9.1.4 i jest taki sam na 9.2.4. Pytanie zaktualizowane. I nie, nie ma zestawienia specyficznego dla kolumn. –

Odpowiedz

4

To jest poprawna. Akcent na A, D, E, E, I, N, O, T, U, U, Y powinny być ignorowane zobaczyć article

czeskie zasady sortowania są trochę skomplikowane :)

3

PostgreSQL nie ma własnych reguł sortowania, korzysta z reguł dostarczonych przez system operacyjny. Jeśli spróbujesz z /usr/bin/sort z tymi samymi ustawieniami regionalnymi, otrzymasz tę samą kolejność sortowania.

Oto wynik z przykładowych danych, gdy próbował z 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; 

Wynik:

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

Zauważ, że jest to klasyfikowane jako mówisz powinno.

Jeśli Twój system operacyjny jest inny i masz pewność, że jest nieprawidłowy, zgodnie z oficjalnymi czeskimi przepisami, to jest to błąd w jego czeskiej implementacji.

UPDATE następujący komentarz:

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

skutkuje:

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

Przykro mi, ale przykład użyty przeze mnie w rzeczywistości działa - błędnie założyłem, że wpływa na wszystkie litery. Problem dotyczy litery D (Ď). Czy możesz spróbować tego samego z tym zestawem: '' 'SELECT * FROM (wartości (" A "), (" Da "), (" Ďb "), (" Dc "), (" E ") AS L (a) ZAMÓWIENIE PRZEZ COLLATE cs_CZ; '' '? Jaki jest zatem wynik? –

1

sortowania jest sortowanie czech poprawna czech grammar rules!

znaków takich jak A, D, E, E, I, N, o, T, U, U, Y są klasyfikowane jak nie mają interpunkcyjny więc skutkować:

A, Da, Ďb, Dc, E to corret z gramatyki czeskiej.

Dla Słowaków i Czech może to brzmieć szaleńczo, ale "zasady jako zasady".

Inne zasady dotyczą języka słowackiego (collate sk_SK), gdzie znaki d-ď, t-ť, n-ň, l-ľ są w tym przypadku uporządkowane alfabetycznie jak czeski Ď.