Java 甲骨文订单不同

Java 甲骨文订单不同,java,oracle,sorting,sql-order-by,mybatis,Java,Oracle,Sorting,Sql Order By,Mybatis,我在Oracle数据库中有这样一个表 ID | LABEL ------------ 1 | label alpha 1 2 | label alpha 2 3 | label alpha a 当我在像Squirrel这样的应用程序中进行选择时,如下所示: select * FROM MA_TABLE order by LABEL asc 我得到: ID | LABEL ------------ 1 | label alpha 1 2 | la

我在Oracle数据库中有这样一个表

ID   | LABEL
------------
 1   |  label alpha 1
 2   |  label alpha 2
 3   |  label alpha a
当我在像Squirrel这样的应用程序中进行选择时,如下所示:

select * FROM MA_TABLE order by LABEL asc
我得到:

ID   | LABEL
------------
 1   |  label alpha 1
 2   |  label alpha 2
 3   |  label alpha a
ID   | LABEL
------------
 3   |  label alpha a
 1   |  label alpha 1
 2   |  label alpha 2
这很好

但当我使用MyBatis执行相同的请求时:

<select id="selectMaTable" resultMap="resultMap" >
  Select * FROM MA_TABLE order by LABEL asc
</select>
字母字符在数字字符之前。。。为什么

提前感谢,

安托万

Ps:我使用org.mybatis:mybatis:jar:3.0.5和com.oracle:ojdbc6:jar:11.2.0.2.0访问数据库

编辑:

多亏了Soulcheck的评论,我发现如果我用order by NLSSORT(ATL_SIT.ATL_SIT_LIB,'NLS_SORT=BINARY')更改order by子句,它会起作用

有人知道如何用myBatis强制NLS_SORT=BINARY吗?
(它已在我的Oracle数据库的NLS_数据库_参数中设置)

看起来可能是区域设置问题。连接squirrel并检查它设置了什么,然后检查使用java应用程序的语言环境。另一个影响排序的参数是
NLS\u sort

您可以通过发出以下命令来检查两者的值:

select parameter,value from NLS_DATABASE_PARAMETERS where parameter in('NLS_LANGUAGE','NLS_SORT');
然后,您可以使用以下方法在java中对其进行测试:

Locale.getDefault()
Locale.setDefault(Locale)
并使用以下命令进行设置:

Locale.getDefault()
Locale.setDefault(Locale)
或者通过添加jvm参数:

-Duser.country=en -Duser.language=en
编辑


建议创建登录触发器,在用户登录时设置NLS\U SORT环境变量。这不是MyBatis,但jdbc无论如何都应该适用于您的情况。

这似乎是一个很好的猜测,谢谢!但是我的NLS_语言是“美国”的,我的NLS_排序是“二进制的”。尽管如此,我还是试图更改java程序中的语言环境(FR,EN,…),但结果仍然是一样的。。。还有其他想法吗?用ORDER BY NLSSORT(标签'NLS_SORT=BINARY')更改ORDER BY语句可以让它工作!但我不想因为我的程序的要求而改变每一个订单。。。也许有人知道一些MyBatis参数有助于改变这种情况??谢谢!现在我将使用这个解决方案。但我仍在尝试在spring中使用datasource参数来找到另一种方法。如果我还发现了什么,我会把它贴在这里