我正在编写一个集成测试,它将复杂的 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 那样进行排序?
最佳答案
晚了才显示答案,但我担心简单的不区分大小写的搜索不一定能满足您的需求。
您希望在搜索中使用的关键字是 collation (并且在更广泛的意义上 locales )和 PostgreSQL 依赖于底层操作系统为此提供支持。排序很少是简单的逐字符比较。例如,在许多语言环境中,空格会被忽略(在 en_GB 中确实如此)。
另外,这意味着您可以在不同的平台上使用不同的排序顺序(取决于 Apple 或 Microsoft 是否同意 Linus 对您所在国家/地区的默认排序)。
关于包含 BSD 许可的库以提供跨平台的一致顺序集是否有意义,已经进行了一些讨论。然而,这是一项大量的工作,意味着您最终可能会在数据库中与操作系统的其余部分进行不同的排序。尽管不同的提供商对如何处理此问题存在分歧,但恐怕没有一个简单的解决方案。
您可能想研究“传统”排序的“C”归类。恐怕我无法评论 Java 对正确语言环境排序的处理 - 这不是我的领域。
关于java - 我怎样才能构建一个比较器,以与 PostgreSQL 相同的方式对字符串进行排序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20957596/