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 定义或在设置数据库时指定它们。有关如何处理排序规则的详细信息,请参阅您的数据库手册。
我在订购数据库记录时遇到问题。我在 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 定义或在设置数据库时指定它们。有关如何处理排序规则的详细信息,请参阅您的数据库手册。