SQL server SORT命令与ASCII代码顺序不对应

时间:2014-11-20 23:17:05

标签: sql-server

我正在使用SQL Server 2012,并且我有一个SQL_Latin1_General_CP1_CI_AS归类的数据库:

create table testtable (c nvarchar(1) null)

insert into testtable (c) values('8')
insert into testtable (c) values('9')
insert into testtable (c) values(':')
insert into testtable (c) values(';')

select c, ASCII(c) ascvalue 
from testtable 
order by c

我得到了这个输出:

c | ascvalue
------------
: | 58
; | 59
8 | 56
9 | 57

为什么SQL Server会对与ascii代码顺序相反的顺序进行排序?

3 个答案:

答案 0 :(得分:4)

整理不是BINARY。 CI 不区分大小写,因此它会折叠大写和小写字符以对其进行排序。它如您所发现的那样以非ASCII方式定义标点符号和数字的排序顺序。它是SQL排序规则,执行SQL排序规则所做的事情:根据某些特定规则定义排序顺序。

答案 1 :(得分:3)

谢谢Ross等人!找到以下文档,其中包含对MS SQL Server排序规则的出色解释,我想在此处发布它,以便让遇到此问题或相关问题的人受益。


  

整理   排序规则指定表示数据集中每个字符的位模式。排序规则还确定排序和比较数据的规则。 SQL Server支持在单个数据库中存储具有不同排序规则的对象。对于非Unicode列,排序规则设置指定数据的代码页以及可以表示的字符。必须将在非Unicode列之间移动的数据从源代码页转换为目标代码页。

有关详细信息,请在此处阅读 http://goo.gl/RpBGWN


从我的代码片段中,如果我想按二进制顺序对值进行排序,则可以将查询更改为以下内容: select c, ASCII(c) ascvalue from testtable order by c collate Latin1_General_BIN

或在创建表时更改归类定义 create table testtable (c nvarchar(1) collate Latin1_General_BIN null)

产生以下结果:

c | ascvalue
------------
8 | 56
9 | 57
: | 58
; | 59

答案 2 :(得分:1)

如果您希望排序位于每个字符的ASCII value,那么您应该在Order by子句中提及显式

select c, ASCII(c) ascvalue from #testtable order by ASCII(c)

其他 SQL_Latin1_General_CP1_CI_AS

告诉我们支持的语言是英语。

排序规则名称中没有BIN表示它支持字典排序

词典排序中的

;字符数据的比较基于字典顺序('A'和'a'<'B'和'b')。

当没有明确定义其他排序时,字典顺序是默认的

CI表示字符数据不区分大小写(表示'ABC'='abc')。

AS表示字符数据具有重音敏感度('à'<>'ä')。