【问题标题】:Convert non-hex text in varchar(max) to varbinary将 varchar(max) 中的非十六进制文本转换为 varbinary
【发布时间】:2020-11-16 04:40:27
【问题描述】:

我在 SQL Server 中有一个表,二进制数据以字符串形式存储在 varchar(max) 字段中。

表名为附件,字段名为“documentbody”。

select id, mimetype, documentbody
from attachment

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

这里是一个“文件”在查询时的样例(仅限前 100 个字符):

JVBERi0xLjQKJeLjz9MNCjEgMCBvYmoKPDwvVHlwZSAvUGFnZQovUGFyZW50IDIgMCBSCi9NZWRpYUJveCBbIDAgMCA2MTIuMDAw

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

【问题讨论】:

  • 最终目标是将数据移动到一个全新的系统 (Salesforce)。如果数据在二进制字段中,或者我可以访问本地文件目录中的文件(我已经编写了游标/bcp,但是将 varchar 数据直接转储到文件中不起作用,我可以这样做 -文件不可读)。无论如何,光标/BCP 转储到文件可能是“硬”的方式,哈哈。如果我可以编写一个将 varchar 转换为 varbinary 的选择查询,那可能是最好的方法。
  • 哇。我认为这确实成功了!谢谢!!将此作为答案发布,以便我们标记它?

标签: sql-server file binary attachment


【解决方案1】:

如果希望将数据从一种数据类型转换为另一种数据类型,但不存在隐式转换,则可以使用CAST or CONVERT

例如

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

CAST 是 ANSI-SQL 的价值,而 CONVERT 是特定于 SQL Server 的。然而CONVERT 处理许多其他情况,包括CAST 无法处理的特定格式。


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

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

【讨论】:

  • 呃……对不起,我想我说得太早了。转换代码似乎将文本本身转换为文本的二进制表示。转换函数没有生成可用的文件。
  • @FNG 你有转换结果应该的例子吗?您是否知道数据最初是如何保存的 - 即从二进制文件到 varchar 字符串发生了哪些转换/转换?
  • 文件应该是 PDFs / pngs / jpgs。我在同一行的同一个表中有文件名(列名是“文件名”),具有正确的预期扩展名。我正在尝试转换并将它们转储到文件中,并尝试打开它们以查看它是否有效,但到目前为止,每次我尝试打开 PDF 时它都说它是一种无效格式。
  • 我明白这一点,但是为了能够将它们转换回原来的样子,我需要知道这种转换是什么,因为它不仅仅是一个简单的转换。
  • 嗨@dale,现在就试试吧!您的代码似乎确实给混乱带来了秩序,并且输出看起来像 PDF 编码。我正在努力测试它,但它看起来很有希望!
猜你喜欢
  • 1970-01-01
  • 2022-01-06
  • 2011-06-24
  • 2018-04-29
  • 1970-01-01
  • 2012-01-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多