完全如何能够无缝支持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
列可以处理任何语言的官方立场,但一次只能使用一种语言?
答案 0 :(得分:2)
你是对的,永远不会有一种完美的方式来整理各种语言的字符串。
PostgreSQL决定不创建自己的排序规则,而是使用操作系统提供的排序规则。这背后的想法是避免重新发明轮子并减少维护工作量 因此,传统的PostgreSQL对您的问题的回答是:如果您希望字符串排序对于不同语言的字符串运行得相当好,请向您的操作系统供应商投诉或选择提供此类排序规则的操作系统。
但是,这种方法存在PostgreSQL社区意识到的缺点:
很少 - 如果有的话 - 人们根据它提供的整理支持决定操作系统。
PostgreSQL的排序行为取决于底层操作系统,这会导致邮件列表上的用户经常出现问题。
对于某些操作系统,在操作系统升级期间,排序规则行为可能会发生变化,从而导致数据库索引损坏(例如,请参阅this thread)。
很可能PostgreSQL改变了它的方法;一直在努力使用ICU库而不是操作系统整理(例如参见this recent thread),这将减轻其中一些问题。