CFDUMP查看二进制数据时不同

4
我有一个SQL Server数据库,其中包含一个类型为varbinary(256)的字段。
当我通过MMS中的查询查看此二进制字段时,其值如下所示:
0x004BC878B0CB9A4F86D0F52C9DEB689401000000D4D68D98C8975425264979CFB92D146582C38D74597B495F87FEA09B68A8440A
当我使用CFDUMP查看相同的字段(和相同的记录)时,该值如下所示:
075-56120-80-53-10279-122-48-1144-99-21104-1081000-44-42-115-104-56-10584373873121-49-714520101-126-61-115116891237395-121-2-96-101104-886810
(对于下面的示例,原始二进制值将是@A,上面的CFDUMP值将是@B)
我尝试使用CAST(@B as varbinary(256)),但未得到与@A相同的值。
我必须怎么做才能将从CFDUMP检索的值转换为正确的二进制表示?
注意:我不再拥有数据库中的适用记录。 我需要将@B转换为可以重新插入varbinary(256)字段的正确值。
1个回答

3

(从评论中扩展)

我并不是在讽刺,但它们如何显示二进制有什么区别呢?这只是数据呈现方式的差异。这并不意味着实际的二进制值不同。

这类似于日期的处理方式。内部,它们是很大的数字。但由于大多数人不知道1234567890表示哪个日期,应用程序选择以更符合人类习惯的格式显示数字。因此,SSMS可能会将日期显示为2009-02-13 23:31:30.000,而CF可能会将其显示为{ts '2009-02-13 23:31:30'}。即使表示方式不同,它们在内部仍然是相同的值。

关于二进制,SSMS将其显示为十六进制。如果您在查询列上使用binaryEncode(),并将二进制转换为十六进制,则可以看到它是相同的值。只是没有前导的0x

  writeDump( binaryEncode(yourQuery.binaryColumn, "hex") )

如果您在二进制方面遇到其他问题,能否请您详细说明?
更新:
不幸的是,我认为您无法轻松地将cfdump表示转换回二进制。与Railo实现不同,Adobe的cfdump只是将各个字节的数字表示连接成一个大字符串,没有分隔符。(破折号只是负数)。您可以通过循环遍历示例字符串的字节来重现此过程。下面的代码生成与您发布的相同的数字字符串。
   bytes = binaryDecode("004BC878B0CB9A4F...", "hex");
   for (i=1; i<=arrayLen(bytes); i++) {
       WriteOutput( bytes[i] );
   }

我认为理论上可能将该字符串转换为二进制,但这会非常困难。据我所知,没有办法准确地确定一个数字(或字节)的开头和结尾。虽然有一些线索,但最终仍然需要猜测。
Railo的实现显示用破折号“-”分隔的字节值。两个连续的破折号表示负数。例如:“0”,“75”,“-56”等。
因此,您可能可以将该字符串解析回字节数组。然后使用<cfqueryparam cfsqltype="CF_SQL_BINARY" ..>将二进制数据插入到数据库中。不幸的是,这对您没有帮助,但这个解释可能会帮助下一个人。
目前,我认为最好的方法是从数据库备份中恢复数据。

我不小心删除了两条记录,但我仍然可以通过CFDUMP访问它们。我正在尝试恢复二进制字段,但它们在显示时与SSMS中的不同。我会尝试您的建议并告诉您结果。 - RickInWestPalmBeach
所以...我的问题是数据已经不在数据库中了,因此我需要将这些数据的CFDUMP表示转换为可以重新插入到数据库中的varbinary(256)格式。当我使用BinaryEncode或BinaryDecode时会出现错误。 - RickInWestPalmBeach
我两个都有。我查看了HTML源代码,但似乎没有任何不同。 - RickInWestPalmBeach
唉...进一步研究后,你可能没有什么好运气。我认为你最好的选择是从数据库备份中恢复数据。请查看我的更新回复。 - Leigh

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接