我正在构建一个小型应用程序,其中包含数据库中的世界语单词,因此我有 ĉ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)
顺序不一致 - 我可以接受所有以特殊字符开头的单词放在最后,但所有以 ĉ 开头的单词应该组合在一起,但事实并非如此!为什么 ŝi 和 ĝi 位于 ĉu 和 ĉevaloj 之间?
服务器编码为 UTF8,排序规则为 en_AU.UTF-8。
edit:看起来它对所有特殊字符进行了等效排序 - 它根据每个单词中的第二个字符正确排序。如何让 PostgreSQL 发现 ĉ、ŝ 和 ĝ 不等价?
我可以接受所有以特殊字符开头的单词
处于最后……
使用整理“C”:
SELECT w."translated"
FROM "words" AS w
ORDER BY w."translated" collate "C" desc limit 10;
也可以看看“order by”子句中的不同行为:Oracle 与 PostgreSQL
使用 ORM 时查询可能会出现问题。解决方案可能是使用以下命令重新创建数据库LC_COLLATE = C
选项,正如OP在评论中建议的那样。还有一个选项 - 更改单个列的排序规则:
ALTER TABLE "words" ALTER COLUMN "translated" TYPE text COLLATE "C";
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)