我在使用MySQL工作了一段时间之后,第一次尝试PostgreSQL数据库。我的环境是cPanel和phpPgAdmin的共享托管。令我困惑的一件事是数据库整理。我托管的cPanel始终会创建数据库,rdd.cache
,Encoding
和Collation
设置为Character Type
,UTF8
和en_US.UTF-8
分别。我似乎没有办法改变它,因为数据库是通过cPanel创建的,那里没有选项,根据这个答案,这些参数只能通过重新创建所需的数据库来改变设置。
所以我想知道:它真的重要吗?如果排序规则设置为en_us.UTF8,那么非英语甚至非拉丁语字符串会发生什么,例如俄语或希伯来语?它们将如何分类?
更新:我感到困惑,因为在MySQL中,我过去只选择utf8mb4_unicode_ci整理,而不关心特定语言。我想知道它与PostgreSQL中特定于国家语言的排序规则相比如何运作。
答案 0 :(得分:2)
归类行为将取决于底层操作系统的语言环境支持。总的来说,我认为你应该公平地期待" dumb"对于当前语言环境之外的字符,可能通过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)
这也表明,独立于语言的整理概念完全是胡说八道,而人们通常所说的是&#34;类似英语的整理&#34;或者&#34;通过Unicode序数进行整理&#34; (大部分都是英语式的)。