postgresql中使用utf8的多种语言

时间:2016-09-13 03:38:11

标签: postgresql unicode utf-8 collation

完全如何能够无缝支持postgres的utf8字符集中存储的所有语言?我们似乎需要指定一个特定于语言的排序规则以及字符集,例如en_US.utf8。如果我没弄错的话,我们无法将英语(en_US)和中文(zh_CN)存储在同一utf8列中,同时保留任意内容一种有意义的整理行为。如果我将列定义为en_US.utf8,它应该如何处理包含中文(zh_CN)字符/字节序列的值?实际情况是,单个列值可以包含多种语言(例如:“Hello和晚安”),根据单一语言无法进行整理。

是的,我可以实际存储任何字符序列;但是在包含英语,德语,中文,日语和韩语字符串的en_US.utf8列上排序的定义行为是什么?

我知道mysql的utf8mb4_unicode_ci排序规则并不完美,而且它没有遵循任何设定标准来整理整个unicode集。我已经可以听到反mysql的人群在叹息mysql的语言无关的排序是如何随意,语义无意义,甚至纯粹无效。但事实是,它运行良好,并满足utf8 =多语言unicode支持的期望。

postgres是非常顽固的,因为在语义不正确?我知道开发人员在“根据规范做事”时非常严格,但至少可以说,这种无法兼顾多种语言的做法令人沮丧。我是否遗漏了解决多语言问题的问题,或者是单个utf8列可以处理任何语言的官方立场,但一次只能使用一种语言?

1 个答案:

答案 0 :(得分:2)

你是对的,永远不会有一种完美的方式来整理各种语言的字符串。

PostgreSQL决定不创建自己的排序规则,而是使用操作系统提供的排序规则。这背后的想法是避免重新发明轮子并减少维护工作量 因此,传统的PostgreSQL对您的问题的回答是:如果您希望字符串排序对于不同语言的字符串运行得相当好,请向您的操作系统供应商投诉或选择提供此类排序规则的操作系统。

但是,这种方法存在PostgreSQL社区意识到的缺点:

  • 很少 - 如果有的话 - 人们根据它提供的整理支持决定操作系统。

  • PostgreSQL的排序行为取决于底层操作系统,这会导致邮件列表上的用户经常出现问题。

  • 对于某些操作系统,在操作系统升级期间,排序规则行为可能会发生变化,从而导致数据库索引损坏(例如,请参阅this thread)。

很可能PostgreSQL改变了它的方法;一直在努力使用ICU库而不是操作系统整理(例如参见this recent thread),这将减轻其中一些问题。