SQL Server SORT顺序与ASCII代码顺序不对应

Leo*_*Nix 5 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
Run Code Online (Sandbox Code Playgroud)

我得到以下输出:

c | ascvalue
------------
: | 58
; | 59
8 | 56
9 | 57
Run Code Online (Sandbox Code Playgroud)

为什么SQL Server排序顺序与ASCII代码顺序相反?

Leo*_*Nix 5

谢谢罗斯等人!找到以下文档,其中对 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 | 升值
------------
8 | 56
9 | 57
: | 58
; | 59