3

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

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

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

4

1 回答 1

3

排序规则行为将取决于底层操作系统的语言环境支持。一般来说,我认为您应该对当前语言环境之外的字符进行相当“愚蠢”的排序,可能是通过 Unicode 代码点。可能是unicode collat​​ion algorithm 的默认 collat​​oin

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

但是请注意,您可以使用该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 序号排序”(主要是类似英语的顺序)。

于 2015-10-04T07:28:47.417 回答