我正在构建一个包含我的数据库中的世界语单词的小应用程序,所以我有像ĉ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)
Run Code Online (Sandbox Code Playgroud)
但是以下查询给出了一些奇怪的输出:
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)
Run Code Online (Sandbox Code Playgroud)
排序是不一致的 - 我可以使用以特殊字符开头的所有单词,但是所有以ĉ开头的单词应该组合在一起,而不是!为什么ŝi和ĝi介于ĉu和ĉevaloj之间?
服务器编码为UTF8,排序规则为en_AU.UTF-8.
编辑:看起来它将所有特殊字符排序为等效字符 - 它根据每个单词中的第二个字符正确排序.如何使PostgreSQL看到ĉ,ŝ和ĝ不等同?
我会接受所有以特殊字符开头的单词的结尾...
使用排序规则“ C”:
SELECT w."translated"
FROM "words" AS w
ORDER BY w."translated" collate "C" desc limit 10;
Run Code Online (Sandbox Code Playgroud)
另请参见“ order by”子句中的不同行为:Oracle与PostgreSQL
使用ORM,查询可能会出现问题。解决方案可能是使用选项LC_COLLATE = C重新创建数据库(如注释中建议的OP)。还有一个选项-更改单个列的排序规则:
ALTER TABLE "words" ALTER COLUMN "translated" TYPE text COLLATE "C";
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2667 次 |
| 最近记录: |