【发布时间】:2018-07-09 17:34:47
【问题描述】:
我正在编写一个集成测试,它将复杂的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 一样排序呢?
【问题讨论】:
-
Java 以 ASCII 顺序执行。 PG 似乎按字母顺序排列,同一字母的小写和大写按该顺序排序(小写
-
@DaveNewton 是的,但是如果那里有一个已经有这样一个比较器的库,我宁愿使用它而不是自己编写。你知道一个吗?
-
是的,String.CASE_INSENSITIVE_ORDER,在标准 API 中。
标签: java string postgresql sorting