varbinary数据是如何排序的

时间:2014-10-08 10:55:39

标签: sql sql-server tsql

所以我可以ORDER BY覆盖MS SQL Server中的varbinary列。我想知道这背后的算法是什么。我没有找到任何关于如何在SQL Server中比较varbinary数据的官方文档。我可以通过实验来猜测它所使用的规则,但我不想将我的解决方案建立在猜测上。

那么有人知道有关此事的任何细节吗?

1 个答案:

答案 0 :(得分:1)

在SQL Server中比较和排序二进制数据的规则与通常比较字节数组(每个字节,从左到右)基本相同。 SQL Server的一个区别是NULL值的概念,这会导致未知的比较结果,并导致NULL值在非NULL值之前排序。

<强>更新

此外,SQL Server在二进制字符串比较中忽略尾随二进制零。

根据this Connect feedback item,SQL Server在比较二进制字符串时遵循ANSI SQL标准。以下是微软对此行为的相关评论。

  

行为实际上是设计的,我们遵循ANSI SQL   规格。请参阅以下规则中的最新规范(5c in   特别):

     

5)两个二进制字符串值X和Y的比较,两者都不是二进制大对象字符串值,确定如下:

     

a)设Lx为X的八位字节长度,Ly为长度   Y的八位字节。让Xi,1(一)≤i≤Lx,为第i个八位字节的值   X,并且让Yi,1(一)≤i≤Ly,是第i个八位位组的值   收率

     

b)如果Lx = Ly且Xi = Yi,1(one)≤i≤Lx,则X等于Y.

     c)如果Lx < Ly,Xi = Yi,所有i≤Lx,最右边的Ly - Lx   Y的八位字节都是X'00,然后它是实现定义的   X等于Y或X是否小于Y.

     

d)如果Lx < Ly,Xi = Yi所有i≤Lx,并且至少有一个   最右边的Ly - Lx八位字节不是X'00',那么X小于Y.

      e)如果Xj < Yj,对于某些j,0(零)&lt; j≤最小值(Lx,Ly),Xi = Yi   对于所有我&lt; j,那么X小于Y.

     

基本上,标准将其留给实现来处理仅相差00或更小的字符串。我们认为它是平等的。

我想补充一点,这里的一个字节是8位无符号原始值,类似于.NET中的字节类型。这与Java不同,后者将字节类型视为有符号值。