2013-10-30 21 views
2

看起來SQL Server在按包含管道字符的字符列進行排序時必須做些特別的事情。sql server如何通過使用管道字符來排序

ASCII( '0')返回由返回48

訂單

ASCII( '| |')一樣的unicode( '')返回124 '|'字母和數字之前的字符。

我試圖看看排序規則,在我看過的'|'性格總是價值124

這裏是我的測試選擇

select * from (
    select '0' as col1, ASCII('0') as col2, unicode('0') as col3 
    union select '1' as col1, ASCII('1') as col2, unicode('1') as col3 
    union select '|' as col1, ASCII('|') as col2, unicode('|') as col3 
    union select 'a' as col1, ASCII('a') as col2, unicode('a') as col3 
    union select ' ' as col1, ASCII(' ') as col2, unicode(' ') as col3 
    union select '.' as col1, ASCII('.') as col2, unicode('.') as col3 
    union select '/' as col1, ASCII('/') as col2, unicode('/') as col3 

) as q 
order by col1 

該查詢將返回:

col1 col2 col3 
1   32 32 
2  . 46 46 
3 / 47 47 
4  | 124 124 
5  0 48 48 
6  1 49 49 
7  a 97 97 

爲什麼47和48之間的124下跌呢?

正在使用的排序規則是SQL_Latin1_General_CP1_CI_AI。

如果只有二進制排序規則使用字符的ascii/unicode值進行排序,那麼如何才能找到排序順序對此排序規則中字符的排序?

+0

這只是使用字符代碼進行排序的二進制排序規則。 '選擇ASCII('A'),ASCII('a')'返回'65,97',但是在大多數排序規則中,這些排序順序相鄰。 –

+0

我的實例正在使用SQL_Latin1_General_CP1_CI_AI,因此您正確的'A'和'a'彼此相鄰。你知道如何找到排序的排序嗎? – GregA100k

+0

並不那麼簡單。 'SELECT CHAR(number)FROM master..spt_values WHERE type ='P'AND number BETWEEN 0 AND 255 ORDER BY CHAR(number)'給出了一些想法。但是,如果您查看'SELECT'Æ'AS X UNION SELECT'AE'UNION SELECT'AF'ORDER BY X'的排序順序,則不是每個字符排序順序。 –

回答

3

不同的排序規則會改變字符的比較順序。他們做不是更改任何字符的ASCII碼或Unicode值。換句話說,整理幾乎不會簡單地按ASCII碼或Unicode值進行排序。

+0

你知道如何判斷角色的價值在特定的排序規則中嗎? – GregA100k

+0

@G_A - 你的意思是'SELECT ASCII(CAST(N'ф'COLLATE Bosnian_Cyrillic_100_CS_AS AS CHAR(1)))'?或者是其他東西? –

+0

@MartinSmith如果這是排序的值將用於比較,那麼是的。 SELECT ASCII(CAST(N'|'COLLATE SQL_Latin1_General_CP1_CI_AI AS CHAR(1))) 與ascii('|')和unicode('|')函數一樣返回124。 – GregA100k

0

作爲提到的一些評論和答案,訂單的順序是由整理確定的。字符在unicode圖表中的位置確實影響順序。

Unicode Collation Algorithm歸類序列基礎上組成的多層次比較算法:

Base Characters 
Accents 
Case Variants 
Punctuation 
Identical Level 

凡同一水平是如何打破僵局時,兩個字符串相同的一些規則。

除了這個工作原理的規則之外,我還想找出給定排序規則的順序。我一直沒有找到任何關於字符排序的文檔,對於給定的排序規則,它可以使用查詢來顯示。

SELECT CHAR(number) 
FROM master..spt_values 
WHERE type='P' AND number BETWEEN 0 AND 255 
ORDER BY CHAR(number) COLLATE SQL_Latin1_General_CP1_CI_AI 
相關問題