2

当按包含管道字符的字符列排序时,SQL Server 似乎必须做一些特殊的事情。

ascii('|') 和 unicode('|') 一样返回 124

ascii('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 值进行排序,我如何才能找到此排序规则中字符的排序顺序?

4

2 回答 2

3

不同的排序规则会改变字符的比较顺序。它们不会更改任何字符的 ASCII 代码或 Unicode 值。换句话说,排序规则几乎从不简单地按 ASCII 代码或 Unicode 值排序。

于 2013-10-30T22:05:57.573 回答
0

正如提到的一些评论和答案,按顺序排列是由排序规则决定的。unicode 图表中字符的位置确实会影响顺序。

来自Unicode Collat​​ion 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
于 2013-11-07T02:49:19.017 回答