PostgreSQL 使用西里尔文排序 "ь"

标签 postgresql sorting postgresql-9.3 cyrillic

请看一下:

WITH toks AS (
  SELECT tok
    FROM
      unnest('{ь, а, чь, ча, чль, чла}'::text[]) AS tok
  ORDER BY tok COLLATE "uk_UA"
)
SELECT ROW_NUMBER() OVER() AS "#", tok FROM toks
ORDER BY tok COLLATE "uk_UA"

PostgreSQL 9.3 (ubuntu) 给我这个结果:

 # | tok 
---+-----
 1 | а
 2 | ча
 3 | чль
 4 | чла
 5 | чь
 6 | ь
(6 rows)

此处第 1、2、5 和 6 行排序正确(“ь”排在“а”之后),而第 3 行和第 4 行排序错误(“а”排在“ь”之后)。

所有字母都是西里尔字母,我检查了很多次。

请问出了什么问题以及解决方法。(

更新:这是最近在主流中修复的错误:https://sourceware.org/bugzilla/show_bug.cgi?id=17293

UPDATE2:请在下方注明我自己的回答。

最佳答案

PostgreSQL 依靠操作系统的区域设置进行排序。

看看 Ubuntu 14.04 如何排序该列表:

# locale-gen uk_UA.UTF-8
Generating locales...
  uk_UA.UTF-8... done
Generation complete.

# cat >file
ь
а
чь
ча
чль
чла

# LC_ALL=uk_UA.UTF-8 sort file
а
ча
чль
чла
чь
ь

在评论中你说它是不同的,但我在这里得到的与你的查询的顺序完全相同。

确实 чль 出现在 чла 之前,这在直觉上很奇怪,但我不知道西里尔文。

您可以查看 /usr/share/i18n/locales/uk_UA 以了解语言环境的定义,并将其作为 locales 包的 ubuntu 错误提出.

关于PostgreSQL 使用西里尔文排序 "ь",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31135676/

相关文章:

sql - PostgreSQL 10 Rowtype 功能错误?

sql - 如何获取组中 'middle' 值的平均值?

sql - 如何在 JSON 数组 (PostgreSQL 9.3) 中查找元素的索引?

centos - 无法重新启动 Postgres 服务器,也无法终止进程

postgresql - 删除 pg_xlog 文件后 Postgres 不会启动

mysql - 获取所有唯一记录及其对应的列

python - 如何将 csv 中的行插入到 postgres+python 中现有表中的特定列?

java - 无法完美实现QuickSort

sorting - 冒泡排序和选择排序

c++ - 如何使用 C++ 中的排序函数对二维数组进行排序?