postgresql中使用utf8的多种语言

postgresql中使用utf8的多种语言,postgresql,unicode,utf-8,collation,Postgresql,Unicode,Utf 8,Collation,如何才能无缝支持postgres的utf8字符集中存储的所有语言?我们似乎需要指定一种特定于语言的排序规则以及字符集,例如en_US.utf8。如果我没有弄错的话,我们没有能力将英文(en_-US)和中文(zh_-CN)存储在同一个utf8列中,同时保持任何有意义的排序行为。如果我将一列定义为en_-US.utf8,它应该如何处理包含中文(zh_-CN)字符/字节序列的值?实际情况是,一个列值可以包含多种语言(例如:“Hello和”晚安"), 而且根本不能用一种语言来整理 是的,我可以物理存储任

如何才能无缝支持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的语言不可知排序是任意的、语义上没有意义的,甚至是完全无效的。但事实上我s、 它工作得很好,满足了对多语言unicode支持的期望


postgres只是因为在unicode范围内进行整理在语义上是不正确的这一事实而非常固执吗?我知道开发人员在“按照规范做事”方面非常严格",但这种不能处理多种语言的能力至少可以说是令人沮丧的。我是否错过了解决多种语言问题的方法,或者是官方的立场,即一个
utf8
列可以处理任何语言,但一次只能处理一种语言?

你是对的,永远不会有一种完美的方法来整理字符串罗斯语言

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

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

  • 很少有人(如果有的话)根据操作系统提供的排序支持来决定操作系统

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

  • 对于某些操作系统,在操作系统升级过程中,排序行为可能会发生变化,从而导致数据库索引损坏(请参见示例)


PostgreSQL很可能改变了它的方法;人们反复尝试使用库而不是操作系统排序(例如,请参阅),这将缓解其中的一些问题。

“但是,对于包含英语、德语、汉语、日语和韩语字符串的列,排序的定义行为是什么?”-简单地说:你不能。不幸的是,排序支持不是Postgres最强大的领域,
ORDER BY
操作符不允许为排序指定排序规则,如果你只选择一种语言,这将是一种方法。虽然它可以很容易地处理多种语言的内容,但它不能处理排序,这就是r好的。您可以随时尝试
collate=“C”
-不确定UTF8的使用效果如何谢谢,非常有用。太不幸了。自从9.0将复制添加到core中以来,我一直在等待一个真正的项目跳转到pg上。我必须规划我的整个项目,看看我是否可以在不排序用户提供的UTF8字符串的情况下生存。您提到了使用可以解决此情况的内置排序规则。根据您的链接,CentOS似乎是其中之一?我应该搜索哪些术语来了解哪些操作系统支持此设置,以及如何配置操作系统?CentOS是RedHat克隆,对吗?我可以用RedHat Linux和提供es排序支持有glibc。有没有不使用glibc的Linuxen?我想对于这个问题,您使用哪个Linux发行版并不重要。我要做的是使用
sort
命令测试各种语言的字符串。它使用OS排序,这样您就可以测试排序顺序是否适合您。