请参阅下面的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。为什么子字符串中有四个以上的字符?
答案 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”。
对不起,这太久了。解释这似乎比我应该做的工作更有趣。