我正在从SybaseIQ迁移到SQL Server2008,一个主要的差异观察者是ORDER BY子句。在表上创建为create table test(name varchar(20))
插入了一些记录:
insert into test values('Hi')
insert into test values('Toi')
insert into test values('>Toi')
insert into test values('iHh')
insert into test values('hi')
insert into test values('IhH')
insert into test values('1Hi')
insert into test values('2Hi')以如下方式在SQL Server和Sybase上执行select操作:
select * from test order by name descSybase的结果是:
name
-------
iHh
hi
Toi
IhH
Hi
>Toi
2Hi
1Hi SQL server的结果为:
name
-------
Toi
IhH
iHh
Hi
hi
2Hi
1Hi
>Toi 为什么这个顺序在SQL server和Sybase中不同?如何在SQL server中管理order by与Sybase中的order by得到相同的结果?
发布于 2016-12-29 14:22:44
可以将排序规则Latin1_General_BIN2用作SQL server的默认排序规则,也可以对ORDER子句使用指定排序规则。
二进制排序规则
二进制排序规则根据区域设置和数据类型定义的编码值序列对数据进行排序。它们区分大小写。SQL Server中的二进制排序规则定义了将使用的区域设置和ANSI代码页。这将强制执行二进制排序顺序。由于二进制排序规则相对简单,因此有助于提高应用程序性能。对于非Unicode数据类型,数据比较基于ANSI代码页中定义的代码点。对于Unicode数据类型,数据比较基于Unicode代码点。对于Unicode数据类型的二进制排序规则,数据排序中不考虑区域设置。例如,当Latin_1_General_BIN和Japanese_BIN用于Unicode数据时,它们产生相同的排序结果。
SQL Server中有两种二进制排序规则:较旧的BIN排序规则和较新的BIN2排序规则。在BIN2排序规则中,所有字符都是按照它们的码位排序的。在排序规则中,只有第一个字符是根据码位排序的,其余的字符是根据它们的字节值排序的。(由于英特尔平台采用小端体系结构,因此Unicode代码字符始终以字节交换方式存储。)
declare @Test table (name varchar(20) collate Latin1_General_BIN2)
insert @Test values ('Hi'), ('Toi'), ('>Toi'), ('iHh'), ('hi'), ('IhH'), ('1Hi'), ('2Hi')
select * from @Test order by name desc或者只是
select * from @Test order by name collate Latin1_General_BIN2 desc发布于 2016-12-29 14:25:20
对列使用ASCII值,并按降序顺序按其排序。ASCII将为您的第一个word排序,然后您可以对列应用排序
SELECT Name FROM @tblTest ORDER BY ASCII(Name) desc,Name降序排列的输出:

以升序表示的输出:

https://stackoverflow.com/questions/41374115
复制相似问题