Select 在 windows 和容器中的排序方式不同

Select ordering works differently on windows and in container

我在订购数据库记录时遇到问题。我在 SpringBoot 应用程序中使用 jOOQ 和 DSLContext 从已配置的 Oracle 数据库获取 select 数据。在我的 Windows 设备上本地一切正常。将应用程序部署到 Openshift 容器平台后,相同的 select 订单记录不同。数据库包含带有重音符号和特殊字符的斯洛伐克语文本值,如您在结果表中所见。

Select:

var companies = DSLContext.select().from(Company.COMPANY)
                                   .orderBy(Company.NAME)
                                   .fetch()
                                   .stream()
                                   .map(this::mapCompany)
                                   .collect(Collectors.toList());

Windows结果:(好结果)

ID NAME
1 Aaaa
2 Áááá
3 Bbbb
4 "Bcbb"
5 "Ccccc"

已部署应用的结果:(错误结果)

ID NAME
1 "Bcbb"
2 "Ccccc"
3 Aaaa
4 Áááá
5 Bbbb

我认为问题是由 windows 和容器 (unix) 上的不同语言环境或编码引起的。该应用程序正在使用 dockerfile 进行部署。谁能提供一些解决方案,如何在容器中实现与 Windows 中相同的行为?

jOOQ API 支持 collations,这是 SQL 指定不同字符集和语言环境排序顺序的方法。你可以这样写:

var companies = DSLContext.select().from(Company.COMPANY)
                                   .orderBy(Company.NAME.collate(myCollation))
                                   .fetch(this::mapCompany)

但是,只有在您无法控制数据库排序规则时,这才是真正的好主意。否则,最好使用 table 定义或在设置数据库时指定它们。有关如何处理排序规则的详细信息,请参阅您的数据库手册。