我如何建立一个比较器,以PostgreSQL的方式对字符串进行排序?[英] How can I build a comparator that sorts Strings the same way that PostgreSQL does?

本文是小编为大家收集整理的关于我如何建立一个比较器,以PostgreSQL的方式对字符串进行排序?的处理方法,想解了我如何建立一个比较器,以PostgreSQL的方式对字符串进行排序?的问题怎么解决?我如何建立一个比较器,以PostgreSQL的方式对字符串进行排序?问题的解决办法?那么可以参考本文帮助大家快速定位并解决问题。

问题描述

我正在编写一个集成测试,它将一个复杂的 order by 传递给 PostgreSQL,然后检查数据是否以正确的顺序返回.我正在用 Java 编写这个集成测试,它的 String.compareTo 方法似乎对事物的排序与 PostgreSQL 不同.我在我的 PostgreSQL 数据库上运行了这个:

SELECT regexp_split_to_table('D d a A c b', ' ') ORDER BY 1;

它是这样回应的:

a
A
b
c
d
D

然后我创建了这个单元测试来与 Java 对事物进行排序的方式进行比较:

import com.google.common.collect.Lists;
import com.google.common.collect.Ordering;
import org.junit.Test;

import java.util.List;

import static junit.framework.Assert.assertEquals;

public class PostgresqlSortOrderTest {

    @Test
    public void whenJavaSortsStringsThenItIsTheSameAsWhenPostgresqlSortsStrings() {
        List<String> postgresqlOrder = Lists.newArrayList("a", "A", "b", "c", "d", "D");
        Ordering<String> ordering = new Ordering<String>() {
            @Override
            public int compare(String left, String right) {

                return left.compareTo(right);
            }
        };
        List<String> javaOrdering = ordering.sortedCopy(postgresqlOrder);
        assertEquals(postgresqlOrder, javaOrdering);
    }

}

此输出失败:

Expected :[a, A, b, c, d, D]  //postgresql
Actual   :[A, D, a, b, c, d]  //java

我对这里的术语一无所知.我想知道这些不同字符串类型的名称,以便更好地交流.但更重要的是,我怎样才能让 Java 像 PostgreSQL 一样排序呢?

推荐答案

迟到会给出答案,但恐怕一个简单的不区分大小写的搜索不一定能达到你想要的效果.

您想要在搜索中使用的关键字是 collat​​ion(更广泛地说是 locales) 和 PostgreSQL 依赖底层操作系统来提供支持.排序很少是简单的逐个字符比较.例如,在许多语言环境中,空格会被忽略(在 en_GB 中肯定是这种情况).

此外,这意味着您最终可以在不同平台上获得不同的排序顺序(取决于 Apple 或 Microsoft 是否同意 Linus 对您所在国家/地区的默认排序).

关于包含 BSD 许可的库以提供跨平台的一致排序集是否有意义,已经进行了一些讨论.但是,这需要大量工作,然后意味着您最终可能会在数据库中与操作系统的其余部分进行不同的排序.虽然不同的供应商在如何处理这个问题上存在分歧,但恐怕没有一个简单的解决方案.

您可能想要研究"传统"排序的"C"排序规则.恐怕我无法评论 Java 处理正确的区域设置排序 - 不是我的领域.

本文地址:https://www.itbaoku.cn/post/1764001.html