在按包含管道符的字符列进行排序时,SQL服务器似乎必须执行一些特殊操作。
ascii('|')和unicode('|')
一样返回124ascii('0')返回48
按退货排序'|'字母和数字前的字符。
我试图查看整理情况,在我看过的情况下,“|”字符总是有值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
为什么124落在47到48之间?
使用的排序规则是SQL_Latin1_General_CP1_CI_AI。
如果只有二进制排序规则使用字符的ascii / unicode值进行排序,我如何找到排序规则中排序字符的排序顺序?
答案 0 :(得分:3)
不同的排序规则会更改字符的比较顺序。它们不更改任何字符的ASCII码或Unicode值。换句话说,归类几乎从不简单地按ASCII码或Unicode值排序。
答案 1 :(得分: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