Postgres订购UTF-8字符

时间:2015-09-18 11:15:55

标签: postgresql utf-8

我正在构建一个包含我的数据库中的世界语单词的小应用程序,所以我有像ĉapelojn和brakhorloĝo这样的词,带有“特殊”字符。

使用PostgreSQL 9.4.4我有一个words表,其中包含以下模式:

lingvoj_dev=# \d words
                                      Table "public.words"
   Column    |            Type             |                     Modifiers
-------------+-----------------------------+----------------------------------------------------
 id          | integer                     | not null default nextval('words_id_seq'::regclass)
 translated  | character varying(255)      |
 meaning     | character varying(255)      |
 times_seen  | integer                     |
 inserted_at | timestamp without time zone | not null
 updated_at  | timestamp without time zone | not null
Indexes:
    "words_pkey" PRIMARY KEY, btree (id)

但是以下查询给出了一些奇怪的输出:

lingvoj_dev=# SELECT w."translated" FROM "words" AS w ORDER BY w."translated" desc limit 10; 
translated
------------
 ĉu
 ŝi
 ĝi
 ĉevaloj
 ĉapelojn
 ĉapeloj
 ĉambro
 vostojn
 volas
 viro
(10 rows)

顺序是不一致的 - 我可以使用以特殊字符开头的所有单词,但是所有以starting开头的单词应该组合在一起,而不是!为什么ŝi和ĝi介于ĉu和ĉevaloj之间?

服务器编码为UTF8,排序规则为en_AU.UTF-8。

编辑:看起来它将所有特殊字符排序为等效字符 - 它根据每个单词中的第二个字符正确排序。如何使PostgreSQL看到ĉ,ŝ和ĝ不等同?

1 个答案:

答案 0 :(得分:5)

  

我对所有以特殊字符开头的单词都没问题   在最后......

使用整理“C”:

SELECT w."translated" 
FROM "words" AS w 
ORDER BY w."translated" collate "C" desc limit 10; 

另见Different behaviour in “order by” clause: Oracle vs. PostgreSQL

使用ORM查询可能会有问题。解决方案可以是使用选项LC_COLLATE = C(在注释中建议的OP)重新创建数据库。还有一个选项 - 更改单个列的排序规则:

ALTER TABLE "words" ALTER COLUMN "translated" TYPE text COLLATE "C";