en_us.非英语语言的UTF8排序



我第一次尝试使用PostgreSQL数据库,在使用MySQL工作了一段时间之后。我的环境是与cPanel和phpPgAdmin共享主机。令我困惑的一件事是数据库的整理。我主机的cPanel总是创建数据库,Encoding, CollationCharacter Type分别设置为UTF8, en_US.UTF-8en_US.UTF-8。我似乎没有任何方法来改变它,因为数据库是通过cPanel创建的,那里没有选项,根据这个答案,这些参数只能通过重新创建数据库来改变所需的设置。

所以我在想:这真的重要吗?如果排序设置为en_us。UTF8,对于非英语甚至非拉丁字符串,如俄语或希伯来语,会发生什么?它们将如何排序?

Update:我很困惑,因为在MySQL中,我过去只选择utf8mb4_unicode_ci排序,而不关心特定的语言。我想知道与PostgreSQL中特定于国家语言的排序相比,它是如何工作的。

排序行为将取决于底层操作系统的语言环境支持。一般来说,我认为您应该期望对当前语言环境之外的字符进行相当"愚蠢"的排序,可能是通过Unicode码点。可能是unicode排序算法的默认排序。

为了测试这一点,我很难快速找到整理不同的样本数据。

请注意,您可以使用COLLATE术语在每个列或每个操作的基础上声明排序,例如

CREATE TABLE sometable(
   ...,
   companyname text COLLATE "ru_RU",
   ...
);

SELECT *
FROM sometable
ORDER BY companyname COLLATE "ru_RU"

SELECT *
FROM sometable
WHERE companyname < 'Компания' COLLATE "ru_RU"

使您不受限于数据库的排序。

(这样做实际上是正确处理分类/混合语言中的数据的唯一方法,因为无论如何都没有一个正确的整理所有数据的方法)。

编辑显示示例:

test=> SHOW lc_collate;
 lc_collate 
------------
 en_AU.utf8
(1 row)
test=> SELECT * FROM (VALUES ('z'),('aa')) x(y) ORDER BY y;
 y  
----
 a
 aa
 z
(3 rows)
craig=> SELECT * FROM (VALUES ('z'),('aa')) x(y) ORDER BY y COLLATE "da_DK";
 y  
----
 a
 z
 aa
(3 rows)

这也表明,与语言无关的排序的概念完全是无稽之谈,人们通常真正的意思是"类似于英语的排序"或"按Unicode序数排序"(主要是类似于英语的顺序)。

相关内容

  • 没有找到相关文章

最新更新