en_us.UTF8 非英语语言排序规则

tex*_*nic 4 postgresql phppgadmin collation utf-8 cpanel

在使用 MySQL 一段时间后,我第一次尝试 PostgreSQL 数据库。我的环境是与 cPanel 和 phpPgAdmin 共享的托管。让我困惑的一件事是数据库排序规则。我的主机的 cPanel 始终创建数据库Encoding,并将Collation、 和分别Character Type设置为UTF8en_US.UTF-8en_US.UTF-8。我似乎没有任何方法可以更改它,因为数据库是通过 cPanel 创建的,那里没有选项,并且根据此答案,只能通过使用所需设置重新创建数据库来更改这些参数。

所以我想知道:这真的重要吗?如果排序规则设置为 en_us.UTF8,那么对于非英语甚至非拉丁字符串(例如俄语或希伯来语)会发生什么情况?它们将如何排序?

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

Cra*_*ger 5

排序规则行为将取决于底层操作系统的区域设置支持。一般来说,我认为您应该期待对当前语言环境之外的字符进行相当“愚蠢”的排序,可能是按 Unicode 代码点排序。可能是unicode 排序算法的默认排序规则

\n\n

我很难快速找到以不同方式整理的示例数据来进行测试。

\n\n

但请注意,您可以使用以下命令在每列或每个操作的基础上声明排序规则COLLATE,例如

\n\n
CREATE TABLE sometable(\n   ...,\n   companyname text COLLATE "ru_RU",\n   ...\n);\n
Run Code Online (Sandbox Code Playgroud)\n\n

或者

\n\n
SELECT *\nFROM sometable\nORDER BY companyname COLLATE "ru_RU"\n
Run Code Online (Sandbox Code Playgroud)\n\n

或者

\n\n
SELECT *\nFROM sometable\nWHERE companyname < \'\xd0\x9a\xd0\xbe\xd0\xbc\xd0\xbf\xd0\xb0\xd0\xbd\xd0\xb8\xd1\x8f\' COLLATE "ru_RU"\n
Run Code Online (Sandbox Code Playgroud)\n\n

因此您不受数据库排序规则的限制。

\n\n

(这样做实际上是正确处理各种/混合语言中的数据的唯一方法,因为无论如何都没有对所有数据进行正确的排序规则)。

\n\n

编辑显示示例:

\n\n
test=> SHOW lc_collate;\n lc_collate \n------------\n en_AU.utf8\n(1 row)\n\ntest=> SELECT * FROM (VALUES (\'z\'),(\'aa\')) x(y) ORDER BY y;\n y  \n----\n a\n aa\n z\n(3 rows)\n\ncraig=> SELECT * FROM (VALUES (\'z\'),(\'aa\')) x(y) ORDER BY y COLLATE "da_DK";\n y  \n----\n a\n z\n aa\n(3 rows)\n
Run Code Online (Sandbox Code Playgroud)\n\n

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

\n