Oracle订单不同

时间:2012-01-11 11:07:35

标签: 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   |  label alpha 2
 3   |  label alpha a

哪个好!

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

<select id="selectMaTable" resultMap="resultMap" >
  Select * FROM MA_TABLE order by LABEL asc
</select>

我明白了:

ID   | LABEL
------------
 3   |  label alpha a
 1   |  label alpha 1
 2   |  label alpha 2

字母字符出现在数字字符之前......为什么??

提前感谢,

安托

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

编辑: this linked help me a bit also

感谢Soulcheck的评论,我发现如果我用ORDER BY NLSSORT(ATL_SIT.ATL_SIT_LIB,'NLS_SORT = BINARY')更改order by子句,它就可以...

有谁知道如何使用myBatis强制NLS_SORT = BINARY? (它已在我的Oracle数据库中设置为NLS_DATABASE_PARAMETERS)

1 个答案:

答案 0 :(得分:3)

看起来它可能是一个区域设置问题。与squirrel连接并检查它设置的NLS_LANG,然后检查哪个语言环境使用您的Java应用程序。另一个可以影响排序的参数是NLS_SORT

您可以通过发出以下内容来检查两者的价值:

select parameter,value from NLS_DATABASE_PARAMETERS where parameter in('NLS_LANGUAGE','NLS_SORT');

然后你可以使用:

在java中测试它
Locale.getDefault()

并使用以下命令设置:

Locale.setDefault(Locale)

或通过添加jvm参数:

-Duser.country=en -Duser.language=en

修改

spring forums建议创建一个登录触发器,在用户登录时设置NLS_SORT环境变量。它不是MyBatis,但是jdbc无论如何应该适合你的情况。