2016-08-22 82 views
2

所以我最近在比較兩個值時遇到了一個奇怪的錯誤。T-SQL ORDER BY忽略「' - '+ ...」但不是「'+'+ ...」

我的數值範圍是從-1到2. 有時它認爲-1大於0,解決方案很簡單。顯然是列設置爲varchar(50),而不是int。

但這讓我想到爲什麼會發生這種情況。因爲即使列被設置爲varchar(50),' - '應該具有比'0'更低的char值(char值爲' - '爲45且char值爲'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 

(+具有43的charValue)

由 '+' 順序感覺對但 ' - ' 似乎.. 。錯誤
任何人都知道爲什麼它是這樣的?

其他信息

Server版本:12.0.4213
整理:Finnish_Swedish_CI_AS

不知道還有什麼可以扭曲的結果。詢問你是否需要更多信息。

+0

請原諒我的無知,但什麼是功能'A(X)'和'B(X)'? –

+0

我得到正常/預期的結果 – Paparazzi

+0

A和B只是創建表的名稱,而x是創建表中單個列的名稱。我本可以更清楚,對不起:P –

回答

1

找到原因。

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

「的SQL排序排序非Unicode數據規則與由微軟Windows 操作系統提供的任何排序例程不兼容 ;但是,Unicode數據的排序與特定版本兼容 因爲非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