2013-05-30 16 views
6

我有整理设置为cs_CZ(捷克)表:PostgreSQL的不当排序与捷克整理的Unicode字符

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

,但是当我通过字符串命令,结果并不像它应该根据捷克字母排序:

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

所以排序一样,如果unicode的重音字符(d)转化成它的ASCII版本,而口音(d)。但捷克字母表是:... C - > D - >Ď - > E ...,所以返回的顺序是不正确的(在这个例子中它应该是:A - > Da - > Dc - >Ďb - > E )。

这是通常的PostgreSQL行为?有没有办法按照捷克语字母正确排序?

编辑:在Postgres 9.1.4上试过,两者都有相同的行为。它是一台Arch Linux机器。
编辑2:调整的例子,Ď是真正的问题。

+1

请告诉我们你正在使用哪个版本的PostgreSQL。 –

+0

恰巧,你碰巧在PostgreSQL 9.1或更新的版本上?如果是这样,您的* foo *表中的*姓*列设置为不同的排序规则? –

+0

对不起,这是Postgres 9.1.4,9.2.4上也是一样。问题已更新。不,没有列专用的排序规则。 –

回答

4

这是正确的。雅绅特一个,d,E,E,I,N,O,T,U,U,Y应该被忽略看到article

捷克排序规则有点复杂:)

3

PostgreSQL没有自己的排序规则,它使用操作系统提供的规则。如果您使用相同语言环境的/usr/bin/sort进行尝试,则会得到相同的排序顺序。

这里是您的样本数据的结果时,与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; 

结果:

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

注意,像你说的它应该它的排序。

如果您的操作系统排序不同,并且您确定根据官方捷克规则它是错误的,那么这是捷克语言环境实施中的一个错误。

更新如下评论:

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

结果:

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

对不起,我用过的例子其实很有用 - 我错误地认为它会影响所有字母。问题在于字母D(Ď)。你可以试试这个集合:'''SELECT * FROM(values('A'),('Da'),('Ďb'),('Dc'),('E'))AS l (a)由COLLATE cs_CZ命令;'''?那么结果是什么? –

1

在捷克排序规则排序是通过czech grammar rules!

字符,如正确,d,E,E,I,N,O,T,U,U,Y进行排序,如他们没有标点符号这样的结果是:

A,大, Ďb,Dc,E由捷克文法修正。

对于斯洛伐克和捷克,它听起来很疯狂,但“规则就像规则”。

其他规则适用斯洛伐克语(collate sk_SK)其中字符d-ď,t-ñ,n-ň,l-ľ在这种情况下按字母顺序排列,如捷克语Ď。