在使用 MySQL 一段时间后,我第一次尝试使用 PostgreSQL 数据库。我的环境是与 cPanel 和 phpPgAdmin 共享主机。令我困惑的一件事是数据库整理。我的主机的 cPanel 始终创建数据库,其中 Encoding
、Collation
和 Character Type
设置为 UTF8
、分别是 en_US.UTF-8
和 en_US.UTF-8
。我似乎没有办法更改它,因为数据库是通过 cPanel 创建的,那里没有选项,根据这个答案,这些参数只能通过使用所需设置重新创建数据库来更改。
所以我想知道:这真的重要吗?如果排序规则设置为 en_us.UTF8,非英语甚至非拉丁字符串(例如俄语或希伯来语)会发生什么情况?他们将如何排序?
更新:我很困惑,因为在 MySQL 中我过去只选择 utf8mb4_unicode_ci 排序规则而不关心特定的语言。我想知道它与 PostgreSQL 中特定于国家语言的排序规则相比如何工作。
最佳答案
整理行为将取决于底层操作系统的语言环境支持。总的来说,我认为对于当前语言环境之外的字符,您应该期待相当“愚蠢”的排序,可能是通过 Unicode 代码点。可能是 default collatoin for the unicode collation algorithm .
我很难快速找到以不同方式整理的示例数据以进行测试。
但请注意,您可以使用 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 序号排序”(主要是类英语顺序)。
关于postgresql - 非英语语言的 en_us.UTF8 归类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32928090/