T-SQL ORDER BY忽略" ' - ' + ..."但不是" ' +' + ..."

时间:2016-08-22 15:15:12

标签: sql-server tsql sql-order-by varchar ignore

所以我最近在比较两个值时遇到了一个奇怪的错误。

我的值是-1到2的范围。 有时它认为-1大于0,解决方案很容易。显然,列设置为varchar(50)而不是int。

但这让我想到为什么会这样。因为即使将列设置为varchar(50),' - '应该具有低于' 0' (charvalue为' - '为45,charvalue为' 0'应为48)

我做了一些测试,事实证明,我能找到的,' - '是ORDER BY唯一不关心的角色。

示例:

SELECT
    A.x
FROM
    (
        VALUES
            ('-5'), ('-4'), ('-3'), ('-2'), ('-1'),
            ('0'), ('1'), ('2'), ('3'), ('4'), ('5')
    ) A(x)
ORDER BY
    A.x;

SELECT
    B.x
FROM
    (
        VALUES
            ('+5'), ('+4'), ('+3'), ('+2'), ('+1'),
            ('0'), ('1'), ('2'), ('3'), ('4'), ('5')
    ) B(x)
ORDER BY
    B.x

结果:

Result of A
0
1
-1
2
-2
3
-3
4
-4
5
-5

Result of B
+1
+2
+3
+4
+5
0
1
2
3
4
5

(+的charvalue为43)

' +'感觉正确,但' - '好像......错了 任何人都知道为什么会这样?

其他信息

服务器版本:12.0.4213
整理:芬兰语_Swedish_CI_AS

不知道还有什么可能会扭曲结果。询问您是否需要更多信息。

1 个答案:

答案 0 :(得分:1)

找出原因。

TLDR:非unicode和unicode整理排序' - '不同。

  

“SQL排序规则用于排序非Unicode数据的规则不兼容   使用Microsoft Windows提供的任何排序例程   操作系统;但是,Unicode数据的排序是兼容的   使用特定版本的Windows排序规则。因为   非Unicode和Unicode数据的比较规则是不同的   您使用SQL排序规则,您可能会看到不同的结果   比较相同的字符,具体取决于底层数据   类型。例如,如果您使用的是SQL排序规则   “SQL_Latin1_General_CP1_CI_AS”,非Unicode字符串'a-c'少   比字符串'ab',因为连字符(“ - ”)被分类为单独的   在“b”之前出现的字符。但是,如果您转换这些字符串   到Unicode并执行相同的比较,即Unicode字符串   因为Unicode,N'a-c'被认为大于N'ab'   排序规则使用忽略连字符的“单词排序”。“

来源:https://support.microsoft.com/en-us/kb/322112