SUBSTRING如何使用VARBINARY字段?

时间:2015-03-01 13:37:03

标签: sql tsql

请参阅下面的DDL:

CREATE TABLE #Person (id decimal(25,0))
INSERT INTO #Person values (153121432060080000944513)

以及下面的SQL语句:

select substring(HASHBYTES('MD5', 
CAST(id AS varchar(24))),1,4)
from #person

在阅读Hashbytes引用(https://msdn.microsoft.com/en-GB/library/ms174415.aspx)之后,我理解返回了VARBINARY。子字符串函数如何与VARBINARY一起使用。上面的SUBSTRING函数返回以下内容:

0x05DDF8D9

这超过四个字符。我知道0x表示一个VARBINARY。为什么子字符串中有四个以上的字符?

1 个答案:

答案 0 :(得分:0)

您将十六进制输出与字符串混淆。很可能,您的字符串由使用ASCII编码的单字节字符组成。每个字节 - 由8位组成 - 代表一个字符,通常通过将0到127之间的值映射到我们熟悉和喜爱的事物。 “32”是一个空间。 “65”是“A”(大写)。

问题是:当“字符串”真的是“二进制”时,它是如何表示的?突然,计算机不再有一个很好的字符集来映射每个字符。并且,某些字符会出现问题 - “删除”,“新行”,“回车”和零值都是ASCII字符,没有可识别的打印输出。

让我们深入了解一个级别。字母A由位序列“01000001”表示(这是数字65的二进制形式)。表示这一点的常用方法是将其分成一半“0100”和“0001”,然后将每一半解释为数字。使用十六进制(基数16)数字系统,因为对于四位有十六种可能性。前十个值很容易。他们是数字。其他六个(10到15)用字母A-F表示。这些通常是大写的。按惯例,整个值都有一个前导“0x”前缀。

因此,位“01000001”将表示为0x41。考虑“11001010”的另一个例子。这将成为0xCA。如果你愿意,你可以玩游戏,如解密0xC0DE或“0xBEADED”或“0xFEEFIEF0E”。

对不起,这太久了。解释这似乎比我应该做的工作更有趣。