DB2 order by 子句在不同的 OS 上给出不同的结果

DB2 order by clause gives different results on different OS

我正在尝试一个简单的 SQL 在 DB2 中使用 order by 子句对 varchar 列进行排序。

查询类似于:

select * from ThirdParty where ThirdPartyKy > 10001 order by ThirdPartyName

我为 ThirdPartyName 列提供的示例数据是(不一定按相同的顺序):

第三方名称:

'AA'
'bb'
'CC'
'BB'
'aa'
'cc'

我正在使用 SQuirrel 针对 DB2 10.5 FP8 的本地 windows 安装和 AIX 上的服务器安装(相同版本)执行此查询。 我在这两个方面得到了上面 SQL 的不同输出。

DB2 上的输出 - Windows

'aa'
'AA'
'bb'
'BB'
'cc'
'CC'

DB2 上的输出 - AIX

'AA'
'BB'
'CC'
'aa'
'bb'
'cc'

现在,我知道使用 'upper(thirdpartyname)' 会得到我想要的结果,即首先以特殊字符开头的字符串,然后是数字,然后是不区分大小写的字符串排序。 我无法理解为什么行为会有所不同?有没有人观察到 DB2 的相同行为? 我也开始想知道我还有什么需要注意的。

Db2 和大多数其他数据库系统中字符串的排序顺序取决于数据库系统和数据库的设置(有时 table 和列)。

我的猜测是您的设置不同。数据库是否具有相同的代码页?他们有相同的语言吗?相同的整理顺序?

这里是link字符串比较规则。他们确定排序顺序: https://www.ibm.com/support/knowledgecenter/en/SSEPGG_10.1.0/com.ibm.db2.luw.sql.ref.doc/doc/r0008479.html

尝试以下方法获取数据库详细信息:

get db cfg

感谢大家的回答。我发现了两个数据库之间的区别。

Windows 副本具有以下整理顺序: 数据库整理顺序 = SYSTEM_1252

虽然 AIX 副本具有以下内容: 数据库整理顺序 = IDENTITY

相关文章: https://www.ibm.com/support/knowledgecenter/en/SSEPGG_10.1.0/com.ibm.db2.luw.admin.nls.doc/doc/c0006812.html , https://www.ibm.com/support/knowledgecenter/SSEPGG_10.1.0/com.ibm.db2.luw.admin.nls.doc/doc/c0006813.html

这是您的不同系统上安装的排序规则问题。一个解决方案是在安装时采用相同的排序规则,或者像这样纠正您的查询:

order by upper(ThirdPartyName)