如何才能无缝地支持存储在postgres的utf8字符集中的所有语言?我们似乎需要与字符集一起指定一个特定于语言的排序规则,例如en_US.utf8。如果我没有弄错的话,我们就无法将英文(en_US)和中文(zh_CN)存储在同一个utf8列中,同时保持任何有意义的排序行为。如果我将列定义为en_US.utf8,它应该如何处理包含中文(zh_CN)字符/字节序列的值?实际情况是,单个列值可以包含多种语言(例如:“Helloand晚安”),而且不能根据一种语言进行排序。
是的,我可以物理地存储任何字符序列;但是在包含英语、德语、汉语、日语和韩国字符串的en_US.utf8列上排序的定义行为是什么?
我知道mysql的utf8mb4_unicode_ci排序规则并不完美,而且它没有遵循任何关于如何整理整个unicode集的设置标准。我已经可以听到反mysql的人群抱怨mysql语言无关的排序规则是如何任意的、语义上没有意义的,甚至是完全无效的。但事实是,它工作得足够好,并且满足了utf8 =多语言unicode支持的期望。
postgres只是非常固执,因为跨unicode光谱进行排序在语义上是不正确的吗?我知道开发人员在“按照规范办事”方面非常严格,但这种不能兼顾多种语言的能力至少令人沮丧。我是否遗漏了解决多语言问题的东西,还是一个utf8列可以处理任何语言,但一次只能处理一种语言的官方立场?
发布于 2016-09-13 07:00:47
你是对的,永远不会有一种完美的方法来整理跨语言的字符串。
PostgreSQL决定不创建自己的排序规则,而是使用操作系统提供的排序规则。这背后的想法是避免重新发明车轮和减少维修工作量。
因此,对于您的问题,传统的PostgreSQL回答是:如果您希望字符串排序规则在不同语言中工作得相当好,请向操作系统供应商投诉,或者选择一个提供这种排序规则的操作系统。
但是,这种方法存在PostgreSQL社区意识到的缺陷:
很可能是PostgreSQL改变了它的方法;人们反复努力使用ICU库而不是操作系统排序规则(参见最近的线索),这将缓解其中的一些问题。
https://stackoverflow.com/questions/39461851
复制相似问题