将 varchar(max) 中的非十六进制文本转换为 varbinary

Convert non-hex text in varchar(max) to varbinary

我在 SQL 服务器中有一个 table,二进制数据作为字符串存储在 varchar(max) 字段中。

table名称为附件,字段名为“documentbody”。

select id, mimetype, documentbody
from attachment

存储在 table 中的文件主要是 PDF,但也包括 JPG 和 PNG,可能还有一些其他文件类型。

这是查询时其中一个“文件”的示例(仅前 100 个字符):

JVBERi0xLjQKJeLjz9MNCjEgMCBvYmoKPDwvVHlwZSAvUGFnZQovUGFyZW50IDIgMCBSCi9NZWRpYUJveCBbIDAgMCA2MTIuMDAw

如何将此数据转换为实际的二进制数据?

当希望将数据从一种数据类型转换为另一种数据类型且不存在隐式转换时,可以使用 CAST or CONVERT.

例如

select cast(MyColumn as varbinary(max)), convert(varbinary(max), MyColumn)
from MyTable;

CAST 是 ANSI-SQL 的值,而 CONVERT 是 SQL 服务器特定的。然而 CONVERT 处理许多其他情况,包括特定格式,CAST 不处理。


好吧,这里完全猜测,很多人将二进制数据编码为 base64 所以试试这个:

SELECT CAST(CAST(N'' AS XML).value('xs:base64Binary(sql:column("MyColumn"))', 'VARBINARY(MAX)') AS VARCHAR(MAX))
FROM MyTable;