我有一个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)字段的正确值。
答案 0 :(得分: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] );
}
我认为理论上可以将该字符串转换为二进制,但这将非常困难。 AFAIK,无法准确地确定一个数字(或字节)的开始位置和另一个数字(或字节)的结束位置。有一些线索,但最终会让人猜测。
Railo的实现,显示由短划线分隔的字节值&#34; - &#34;。两个连续的破折号表示负数。 ie&#34; 0&#34;,&#34; 75&#34;,&#34; -56&#34;,...
0-75--56-120--80--53--102-79--122--48--11-44--99--21-104--108-1-0-0 -0--44--42--115--104--56--105-84-37-38-73-121--49--71-45-20-101--126--61-- 115-116-89-123-73-95--121--2--96--101-104--88-68-10
所以你可能会把那个字符串解析成一个字节数组。然后使用<cfqueryparam cfsqltype="CF_SQL_BINARY" ..>
将二进制文件插入数据库。不幸的是,这对你没有帮助,但解释可能有助于下一个人。
此时,我认为最好的办法就是从数据库备份中恢复数据。