所以我可以ORDER BY
覆盖MS SQL Server中的varbinary
列。我想知道这背后的算法是什么。我没有找到任何关于如何在SQL Server中比较varbinary
数据的官方文档。我可以通过实验来猜测它所使用的规则,但我不想将我的解决方案建立在猜测上。
那么有人知道有关此事的任何细节吗?
答案 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不同,后者将字节类型视为有符号值。