首页 文章

非英语语言的en_us.UTF8校对

提问于
浏览
2

在与MySQL合作一段时间之后,我第一次尝试PostgreSQL数据库 . 我的环境是cPanel和phpPgAdmin的共享托管 . 令我困惑的一件事是数据库整理 . 我的托管的cPanel总是创建数据库, EncodingCollationCharacter Type 分别设置为 UTF8en_US.UTF-8en_US.UTF-8 . 我似乎没有办法改变它,因为数据库是通过cPanel创建的,那里没有选项,根据这个答案,这些参数只能通过使用所需设置重新创建数据库来更改 .

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

Update: 我感到困惑,因为在MySQL中,我过去常常选择utf8mb4_unicode_ci整理而不关心特定语言 . 我想知道它与PostgreSQL中特定于国家语言的排序规则相比如何运作 .

1 回答

  • 2

    排序规则行为将取决于底层操作系统的语言环境支持 . 一般来说,我认为您应该期望对当前语言环境之外的字符进行相当可能的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序列整理”(大多数是英语式的顺序) .

相关问题