如何构建一个比较器,以与 PostgreSQL 相同的方式对字符串进行排序?

2023-11-25

我正在编写一个通过复杂的集成测试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 那样进行排序?


很晚才给出答案,但恐怕简单的不区分大小写的搜索不一定能达到您想要的效果。

您在搜索中想要的关键字是整理(并且在更广泛的意义上locales)并且 PostgreSQL 依赖底层操作系统来为此提供支持。排序很少是简单的逐个字符比较。例如,在许多语言环境中,空格会被忽略(en_GB 中当然就是这种情况)。

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

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

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何构建一个比较器,以与 PostgreSQL 相同的方式对字符串进行排序? 的相关文章

随机推荐