代码之家  ›  专栏  ›  技术社区  ›  Max

Postgresql ORDER_BY…COLLATE with different value返回相同的输出

  •  0
  • Max  · 技术社区  · 4 年前

    我有一个在本地机器(在服务器上一切正常)提供的排序值的问题。好像没什么效果。

    示例SQL代码 en_US 整理:

    SELECT username
    FROM "user" 
    WHERE (
      "user"."username" IN (
        'aaa', 
        'aab', 
        'aac', 
        'a.aa', 
        'a.ab', 
        'a.ac') 
    ORDER BY "user"."username" COLLATE "en_US" ASC;
    

    输出:

    a.aa
    a.ab
    a.ac
    aaa
    aab
    aac
    

    C COLLATE返回相同的输出:

    a、 aa级
    aaa级
    aac公司
    

    但在服务器上,它会为不同的排序返回不同的答案:

    对于 恩努斯 :

    aaa
    aab
    aac
    a.aa
    a.ab
    a.ac
    

    对于 :

    a、 ab型
    a、 交流
    aaa级
    aab公司
    aac公司
    

    SHOW LC_COLLATE;
     lc_collate
    -------------
     en_US.UTF-8
    (1 row)
    

    服务器:Ubuntu,postgres9.6

    SHOW LC_COLLATE;
     lc_collate
    ------------
     en_US.utf8
    (1 row)
    

    两者之间有区别 SHOW LC_COLLATE; 查询输出看起来都是有效的(是否?)。

    这里会有什么问题?

    0 回复  |  直到 4 年前
        1
  •  3
  •   Laurenz Albe    4 年前

    默认情况下,PostgreSQL使用操作系统的C库的排序规则,因此解释是这些排序规则在这些操作系统上是不同的。

    为了避免这个问题,可以使用PostgreSQL版本v10或更好的版本,该版本由ICU支持构建。然后(只要使用相同版本的ICU库),这些排序规则在不同的操作系统中是相同的。

    推荐文章