SQL Server将varbinary转换为字符串

55

我希望能够在T-SQL中将varbinary类型转换为字符串类型

以下是一个示例:

首先,我获得了这个varbinary

0x21232F297A57A5A743894A0E4A801FC3

然后我想将它转换为

21232f297a57a5a743894a0e4a801fc3

如何做到这一点?


1
你使用的SQL Server版本是什么?Andras的回答只适用于2008或更高版本。 - Pondlife
没错,我更新了我的答案,所以如果你使用的是旧版本,你需要另一种解决方案。 - András Ottó
6个回答

89

尝试:

DECLARE @varbinaryField varbinary(max);
SET @varbinaryField = 0x21232F297A57A5A743894A0E4A801FC3;

SELECT CONVERT(varchar(max),@varbinaryField,2), 
@varbinaryField

更新:

针对 SQL Server 2008


2
它也可以用于直接从表中检索时使用:SELECT CONVERT(VARCHAR(MAX), MyBinaryField, 2) FROM MyTable WHERE ID = 123456 - MÇT
7
如果您希望保留前缀“0x”,请在CONVERT表达式中使用1样式标志(而不是2)。 SELECT CONVERT( VARCHAR(MAX), MyBinaryField, 1) FROM MyTable WHERE ID = 123456; - Graeme
2
如何在一行内检查它是否为空? DECLARE @varbinaryField varbinary(max); SET @varbinaryField = 0x21232F297A57A5A743894A0E4A801FC3;SELECT CONVERT(varchar(max), ISNULL(@varbinaryField, 'value is NULL'), 2), @varbinaryField会引发错误:隐式转换从数据类型varchar到varbinary(max)不允许。请使用CONVERT函数运行此查询。 - Jalal

13

我知道这是一个老问题,但是这里有一个替代方案,在某些情况下我发现它更有用。我相信master.dbo.fn_varbintohexstr函数至少从SQL2K开始就在SQL Server中可用。仅出于完整性考虑添加它。一些读者可能还会发现查看此函数的源代码很有教育意义。

declare @source varbinary(max);
set @source = 0x21232F297A57A5A743894A0E4A801FC3;
select varbin_source = @source
,string_result = master.dbo.fn_varbintohexstr (@source)

7

如果您想将单个VARBINARY值转换为VARCHARSTRING),可以通过声明以下变量来实现:

DECLARE @var VARBINARY(MAX)
SET @var = 0x21232F297A57A5A743894A0E4A801FC3
SELECT CAST(@var AS VARCHAR(MAX))

如果你想从表格列中进行选择,可以这样做:

SELECT CAST(myBinaryCol AS VARCHAR(MAX))
FROM myTable

1
由于某种原因,在SQL Server 2012上,转换操作无法正常工作,但是使用Cast函数却解决了问题?谢谢! - ConstantineK
简单的 CAST 可能默认无法工作,因为十六进制表达式会被转换为 ASCII/UNICODE。请使用带有样式标志(1 或 2)的 CONVERT。 - Graeme

3

这在 SQL 2005 和 2008 中都适用:

declare @source varbinary(max);
set @source = 0x21232F297A57A5A743894A0E4A801FC3;
select cast('' as xml).value('xs:hexBinary(sql:variable("@source"))', 'varchar(max)');

1
如何对字段执行相同的转换,但不针对变量? - ZedZip
要对列执行相同的操作而不是变量,您可以使用 sql:column 函数 (http://technet.microsoft.com/en-us/library/ms191214.aspx)。因此,它将是 cast('' as xml).value('xs:hexBinary(sql:column("someColumnNameHere"))'。 - Anssssss

2

我到处寻找答案,最终这个方法对我有效:

SELECT Lower(Substring(MASTER.dbo.Fn_varbintohexstr(0x21232F297A57A5A743894A0E4A801FC3), 3, 8000))

输出结果(字符串):

21232f297a57a5a743894a0e4a801fc3

如果您想将varbinary记录与字符串进行比较/匹配,您也可以在WHERE或JOIN条件中使用它。


有什么想法可以将该字段更新为重新转换回varbinary的字符串? - Frondor

0

这里是我写的一个简单示例,使用两种转换方法进行转换和还原,并使用固定字符串进行检查

declare @VB1 VARBINARY(500),@VB2 VARBINARY(500),@VB3 VARBINARY(500)

declare @S1 VARCHAR(500)

SET @VB1=HASHBYTES('SHA1','Test')

SET @S1=CONVERT(varchar(500),@VB1,2)

SET @VB2=CONVERT(varbinary(500),@S1,2)

SET @VB3=CONVERT(varbinary(500),'640AB2BAE07BEDC4C163F679A746F7AB7FB5D1FA',2)

SELECT @VB1,@S1,@VB2,@VB3

IF @VB1=@VB2 PRINT '它们匹配(2)'

IF @VB1=@VB3 PRINT '它们匹配(3)'

PRINT str(Len(@VB1))

PRINT str(Len(@S1))

PRINT str(Len(@VB2))

SET @VB1=HASHBYTES('SHA1','Test')

SET @S1=CONVERT(varchar(500),@VB1,1)

SET @VB2=CONVERT(varbinary(500),@S1,1)

SELECT @VB1,@S1,@VB2

IF @VB1=@VB2 PRINT 'They Match(1)'

PRINT str(Len(@VB1))

PRINT str(Len(@S1))

PRINT str(Len(@VB2))

输出结果如下:

||| 0x640AB2BAE07BEDC4C163F679A746F7AB7FB5D1FA|640AB2BAE07BEDC4C163F679A746F7AB7FB5D1FA|0x640AB2BAE07BEDC4C163F679A746F7AB7FB5D1FA|0x640AB2BAE07BEDC4C163F679A746F7AB7FB5D1FA

(1 行受影响)

They Match(2)

They Match(3)

    20
    40
    20

|| 0x640AB2BAE07BEDC4C163F679A746F7AB7FB5D1FA|0x640AB2BAE07BEDC4C163F679A746F7AB7FB5D1FA|0x640AB2BAE07BEDC4C163F679A746F7AB7FB5D1FA

(1 行受影响)

它们匹配(1)

    20
    42
    20

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