所以我最近在比较两个值时遇到了一个奇怪的错误。
我的值是-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
不知道还有什么可能会扭曲结果。询问您是否需要更多信息。
答案 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' 排序规则使用忽略连字符的“单词排序”。“