我第一次尝试使用PostgreSQL数据库,在使用MySQL工作了一段时间之后。我的环境是与cPanel和phpPgAdmin共享主机。令我困惑的一件事是数据库的整理。我主机的cPanel总是创建数据库,Encoding
, Collation
和Character Type
分别设置为UTF8
, en_US.UTF-8
和en_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序数排序"(主要是类似于英语的顺序)。