2013-05-30 15 views
6

Ben cs_CZ (Çek) ayarlanır harmanlama içeren bir tablo var: Ben dize tarafından sipariş zaman Çek alfabesinin göre olması gerektiği gibiPostgreSQL yanlış Çek harmanlama ile unicode karakter sıralar

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

ama, sonuç olarak sıralanmamıştır : Yani unicode vurgu karakteri (D) vurgu (D) olmadan ASCII sürümü döndürülecekse gibi sıralanır

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

. Ama Çek alfabesi: ... C -> D -> Ď -> E ..., bu yüzden döndürülen düzen yanlıştır (bu örnekte şöyle olmalıdır: A -> Da -> Dc -> Ďb -> E).

Bu alışıldık PostgreSQL davranışı mı? Çek alfabesine göre doğru şekilde nasıl sıralanır bir yolu var mı?

DÜZENLEME: Postgres 9.1.4'de denenmiş, her ikisi de aynı davranışı vardır. Bu bir Arch Linux makinesidir.
EDIT2: Düzeltilmiş örnek, real gerçek bir sorundur.

+1

Lütfen hangi PostgreSQL sürümünü kullandığınızı bize bildirin. –

+0

Sadece tesadüfen, PostgreSQL 9.1 veya daha yeni bir versiyonda oluyor musunuz? Öyleyse, * foo * tablonuzdaki * soyadı * sütunu farklı bir harmanlamaya ayarlandı mı? –

+0

Üzgünüm, bu Postgres 9.1.4 ve 9.2.4 de aynıdır. Soru güncellendi. Ve hayır, herhangi bir sütuna özel harmanlama yoktur. –

cevap

4

Bu doğrudur. A, D, E, E, I, N, O olması durumunda t, u, ü, ı article

Çek sıralama kuralları biraz karmaşık :)

3

PostgreSQL'in kendi sıralama kuralları yoktur, işletim sistemi tarafından sağlanan kuralları kullanır. Aynı yerel ayar ile /usr/bin/sort ile denerseniz, aynı sıralama düzenini alırsınız. Ubuntu 12.04, PostgreSQL 9.1 ile çalışırken

İşte örnek verilerle elde ettiğimiz sonuç:

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

Sonuç: Eğer olması gerektiği dediğiniz gibi o sıralanmış oluyor

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

Bildirim söyledi.

İşletim sisteminiz farklı şekilde sıralanıyorsa ve resmi çek kurallarına göre yanlış olduğundan eminseniz, bu, çek yerel ayar uygulamasında bir hatadır. yorumları sonrasında

GÜNCELLEME: içinde

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

sonuçları:

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

Üzgünüm, benim kullandığım örnek aslında işe yarıyor - Yanlışlıkla tüm harfleri etkilediğini farz ettim. Sorun D harfiyle (Ď). Bu setle aynı şeyi deneyebilir misiniz: '' 'SELECT * FROM (değerler ('A'), ('Da'), ('Ďb'), ('Dc'), ('E')) AS (a) bir COLLATE cs_CZ İLE SİPARİŞ; '' '? Sonuç ne o zaman? –

1

çek harmanlama sıralama olduğunu görmek göz ardı edilmelidir için Accent olduğunu á gibi czech grammar rules!

Karakterler tarafından doğru, D, e, e, i, n, o, T, U, Ü ı onlar noktalama yüzden neden yok gibi sıralanır:

A, da, ,b, Dc, E, çek dilbilgisi tarafından koredir.

Slovakça ve Çekçe için çılgınca gelebilir, ancak "kurallar olarak kurallar".

Diğer kurallar slovak dili (collate sk_SK) içindir; burada d-ď, t-ť, n-ň, l-ľ karakterleri, bu durumda czech Ď gibi alfabetik sıradadır.