2013-05-30 11 views
6

Ho una tabella con le regole di confronto impostato su cs_CZ (Repubblica):PostgreSQL ordina in modo improprio i caratteri Unicode con collazione Repubblica

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

ma quando ordino da stringa, risultato non è ordinato come dovrebbe essere secondo l'alfabeto Repubblica :

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

Così è ordinato come se il carattere Unicode accento (D) è stato convertito alla sua versione ASCII senza accento (D). Ma l'alfabeto ceco è: ... C -> D -> Ď -> E ..., quindi l'ordine restituito non è corretto (in questo esempio dovrebbe essere: A -> Da -> Dc -> Ďb -> E).

Questo è il solito comportamento di PostgreSQL? C'è un modo per farlo ordinare correttamente secondo l'alfabeto ceco?

MODIFICA: Provato su Postgres 9.1.4, entrambi hanno lo stesso comportamento. È una macchina Arch Linux.
EDIT2: Esempio corretto, il Ď è il vero problema.

+1

Indicare la versione di PostgreSQL che si sta utilizzando. –

+0

Giusto per caso, ti capita di trovarti su PostgreSQL 9.1 o una versione più recente? In tal caso, la colonna * cognome * nella tabella * pippo * è impostata su un confronto diverso? –

+0

Siamo spiacenti, è Postgres 9.1.4 ed è lo stesso in 9.2.4. Domanda aggiornata. E no, non ci sono regole di confronto specifiche per la colonna. –

risposta

4

È corretto. Accent per A, D, E, E, I, N, O, T, U, U, y dovrebbe essere ignorato vedere article

regole di ordinamento ceche sono un po 'complesso :)

3

PostgreSQL non ha le proprie regole di ordinamento, utilizza le regole fornite dal sistema operativo. Se provi con lo /usr/bin/sort con le stesse impostazioni locali, riceverai lo stesso tipo di ordine.

Ecco il risultato con i dati di esempio quando provato con 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; 

Risultato:

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

Si noti che è ordinato come dici dovrebbe.

Se il sistema operativo ordina in modo diverso e si è certi che è errato in base alle regole ceche ufficiali, si tratta di un errore nella sua implementazione di impostazioni locali in ceco.

UPDATE seguente commento:

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

risultati in:

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

Mi dispiace, l'esempio che ho usato effettivamente funziona - ho erroneamente pensato che influenzi tutte le lettere. Il problema è con la lettera D (Ď). Potresti provare lo stesso con questo set: '' 'SELECT * FROM (valori ('A'), ('Da'), ('Ďb'), ('Dc'), ('E')) AS l (a) ORDINE DI UN COLLATO cs_CZ; '' '? Qual è il risultato allora? –

1

ordinamento in collazione ceca è corretta czech grammar rules!

Personaggi come A, D, E, E, I, n, O, T, U, U, Y sono ordinati come non hanno la punteggiatura così il risultato:

A, da, Ďb, Dc, E è corret dalla grammatica ceca.

Per slovacco e ceco può sembrare folle, ma "regole come regole".

Altre regole sono per la lingua slovacco (collate sk_SK) dove i caratteri d-ď, t-ť, n-ò, l-ľ sono in ordine alfabetico come il ceco Ď in questo caso.

Problemi correlati