我正在使用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代码顺序相反的顺序进行排序?
答案 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
表示字符数据具有重音敏感度('à'<>'ä')。