7

我有一个排序规则设置为 cs_CZ(捷克语)的表:

    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 版本。但是捷克字母是:... C -> D -> Ď -> E ...,所以返回的顺序不正确(在这个例子中应该是:A -> Da -> Dc -> Ďb -> E )。

这是通常的 PostgreSQL 行为吗?有没有办法根据捷克字母对其进行正确排序?

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

4

3 回答 3

5

它是正确的。á, ď, é, ě, í, ň, ó, ť, ú, ů, ý 的重音应忽略参见文章

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

于 2013-05-31T06:24:06.380 回答
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;

结果:

一个  
----
 钙
 抄送
 Čb
(3 行)

请注意,它已按您所说的进行排序。

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

更新以下评论:

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

结果是:

一个  
----
 一个
 大
 D b
 直流
 乙
于 2013-05-30T18:37:03.420 回答
1

根据捷克语法规则,捷克排序规则中的排序是正确的!

á, ď, é, ě, í, ň, ó, ť, ú, ů, ý 等字符被排序为没有标点符号,因此结果:

A, Da, Ďb, Dc, E 用捷克文法正确。

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

其他规则适用于斯洛伐克语 (collat​​e sk_SK),其中字符 d-ď、t-ť、n-ň、l-ľ 按字母顺序排列,如本例中的捷克语 Ď。

于 2013-09-19T08:44:15.060 回答