【问题标题】:T-SQL ORDER BY ignores " '-' + ... " but not " '+' + ... "T-SQL ORDER BY 忽略“'-' + ...”,但不忽略“'+' + ...”
【发布时间】:2016-08-22 15:15:12
【问题描述】:

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

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

但这让我想到了为什么会这样。因为即使列设置为 varchar(50),'-' 的 char 值也应该低于 '0'('-' 的 charvalue 是 45,'0' 的 charvalue 应该是 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

(+ 的字符值为 43)

“+”顺序感觉正确,但“-”似乎...错误
有人知道为什么会这样吗?

其他信息

服务器版本:12.0.4213
排序规则:Finnish_Swedish_CI_AS

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

【问题讨论】:

  • 原谅我的无知,A(x)B(x) 的功能是什么?
  • 我得到正常/预期的结果
  • A 和 B 只是创建的表的名称,x 是创建的表中单个列的名称。我本可以说得更清楚,对不起:P
  • 尝试其他排序规则

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


【解决方案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 字符串 N'a-c' 被认为大于 N'ab',因为 Unicode 排序规则使用忽略连字符的“单词排序”。”

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-01
    • 1970-01-01
    • 2010-11-20
    • 2011-08-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多