在postgresql中对平假名中的日语单词进行排序

Posted

技术标签:

【中文标题】在postgresql中对平假名中的日语单词进行排序【英文标题】:Sort order in postgresql for japanese words in hiragana 【发布时间】:2017-05-02 19:19:57 【问题描述】:

我有一个 9.6.2 版本的 postgresql 数据库,其编码为 UTF8 和排序规则 en_GB.UTF8。我的一张表有一个仅包含日文平假名字符的字段。问题是通过 SQL 以正常方式对该字段进行排序(... ORDER BY [field name] ...)不会产生预期的(至少对我而言)结果。相反,排序就像行首先按长度(字段内容)排序,然后才按字符排序。例如,而不是得到:

あめうえおとこかわりきしひ

正如我所料,订单如下:

きしひあめうえおとこかわり

我错过了什么?

【问题讨论】:

t=# with a as (select string_to_array('あめ うえ おとこ かわり き し ひ',' ') a) select unnest(a) from a order by 1; 向我展示了您在 mac 上的预期结果... 谢谢你 - 在我的 mac (postgres 9.6.2) 和我的 centos 7 (postgres 9.2.18) 上,你的表达式导致了意外的顺序(字长似乎更重要的那个比实际字符)。 【参考方案1】:

尝试显式设置排序规则C

t=# with a as (select string_to_array('あめ うえ おとこ かわり き し ひ' COLLATE "en_GB.UTF-8",' ') a) select unnest(a) from a order by 1;
 unnest
--------
 き
 し
 ひ
 あめ
 うえ
 おとこ
 かわり
(7 rows)

t=# with a as (select string_to_array('あめ うえ おとこ かわり き し ひ' COLLATE "C",' ') a) select unnest(a) from a order by 1;
 unnest
--------
 あめ
 うえ
 おとこ
 かわり
 き
 し
 ひ
(7 rows)

【讨论】:

哦 - 这确实有效,而且肯定是关于正在发生的事情的重要线索。再次感谢您的帮助! 请接受和/或支持我的回答 - 我正在努力建立良好的声誉。 值得注意的是,以下内容现在按预期工作(表名是'vocabs',字段名是'kana'):SELECT kana FROM vocabs ORDER BY kana COLLATE "C";跨度> 而且,由于我在 Ruby on Rails 的上下文中工作,模型名称为“Vocab”,因此以下内容也可以按预期工作: Vocab.order('kana COLLATE "C"' )

以上是关于在postgresql中对平假名中的日语单词进行排序的主要内容,如果未能解决你的问题,请参考以下文章

日语学习五十音课程学习Lesson-1

日语学习笔记

综合日语第一册第八课

日文汉字转假名

Postgresql将日文全宽转换为半宽

日语——动词的各种变形