【问题标题】:SQL Server string to varbinary conversionSQL Server 字符串到 varbinary 的转换
【发布时间】:2012-12-18 05:28:38
【问题描述】:

好的,问题是需要在 2 个表上进行合并或连接。一个将文件内容存储为 [image] 类型或 varbinary(max),另一个将文件内容存储为十六进制字符串。如果我将相同的内容上传到两个表中

字符串的内容(字节数组到字符串)看起来像这样......

'application/vnd.xfdl;content-encoding="base64-gzip"
H4sIAAAAAAAAC+y9e1fjONI4/H9/Cg173idwFgIJl+5m6MzPJAayE+KsnXQPs8+cHJMY8HZi57ET
aObMh3918UW2Jcdyrmbg7E7HtqpUpSqVSqWSdPHLj/EIPBuOa9rWl51K+WgHGNbAHprW45edpqYc
fPp0+vmgsvNL7cPFb1eNFoDlLffLztN0Ojk/PHx5eSl3Zo4hDx+N8sAeH6Iyh2fl0x1S8Hwwc6f2'    
...

图像的内容看起来像(这最终是我想要的样子)

0x6170706C69636174696F6E

如果我选择convert(varbinary(MAX), @contentAsString),我会得到0x6100700070006C00690063006100740069006F006E

看起来好像转换是在目标上,但在每个之间放置了两个零 (00),由于缺少更好的词,我将其称为一个字节。

我已经尝试过各种更复杂的方法在论坛上发布,但无济于事。 任何帮助将不胜感激。

【问题讨论】:

  • 在您的示例中,另一个表包含 base64 编码而不是十六进制字符串。该示例是您打算作为输出接收的还是实际的源格式?
  • 这不是十六进制字符串。问题具有误导性。

标签: sql string type-conversion varbinary


【解决方案1】:

来自MSDN

在 SQL Server 2008 中,这些转换更加容易,因为我们 直接在 CONVERT 内置函数中添加了支持。代码 下面的示例显示了如何执行转换:

declare @hexstring varchar(max);

set @hexstring = '0xabcedf012439';

select CONVERT(varbinary(max), @hexstring, 1);

set @hexstring = 'abcedf012439';

select CONVERT(varbinary(max), @hexstring, 2);

go

declare @hexbin varbinary(max);

set @hexbin = 0xabcedf012439;

select
   CONVERT(varchar(max), @hexbin, 1),
   CONVERT(varchar(max), @hexbin, 2);

go

【讨论】:

  • @hexstring 看起来像这样:'application/vnd.xfdl;content-encoding="base64-gzip" H4sIAAAAAAAAC+y9e1fjONI4/H9/Cg173idwFgIJl+5m6MzPJAayE+KsnXQPs8+cHJMY8HZi57ET'... 目标二进制 = 0x6170706C69636174696F6E select CONVERT(varbinary(max), @hexstring); - 成功,但错误的二进制 0x6100700070006C00690063006100740069006F006E @987654323 到 var27 数据类型转换为 nvar26 失败“@错误” @ - 失败“将数据类型 nvarchar 转换为 varbinary 时出错”
  • 我已经测试了我可以在网上找到的几乎所有内容,例如“来自 MSDN”类型的帖子。剩下的问题是,为什么通用 CONVERT(varbinary(MAX), @hexstring) 每隔 2 个字符填充 00,有没有办法摆脱它?
【解决方案2】:

好的,所以填充的 00 已被回答。

DECLARE @hexStringNVar nvarchar(max)
DECLARE @hexStringVAR varchar(max)

SET @hexStringNVar = '{my hex string as described above}'
SET @hexStringVAR = '{my hex string as described above}'

select CONVERT(varbinary(MAX), @hexStringNVar)) = 0x6100700070006C00690063...
select CONVERT(varbinary(MAX), @hexStringVAR)) = 0x6170706C6963...

00 填充是因为 Unicode 或 NVARCHAR 而不是 VARCHAR

所以,既然存储的数据在nvarchar(max),解决办法是这样的:

select CAST(cast(@hexStringNVar as varchar(max)) as varbinary(max)) = 0x6170706C6963...

我确信convert 也能正常工作,但我的目标 SQL Server 是 2005。

【讨论】:

  • 或者将存储类型改为varchar而不是nvarchar
猜你喜欢
  • 1970-01-01
  • 2011-03-18
  • 2011-06-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多