SQL Server中的varbinary如何转换为字符串?

134

如何将varbinary(max)类型的列值转换为易读的varchar类型?


3
我想要使用varchar,因为这个值是从字符串值插入的。我的意思是读取被写入的内容。 - Bilgin Kılıç
@MartinSmith 人们逼我改变。所以我又标记了你的答案。谢谢你的友善评论。 - Bilgin Kılıç
2
人们似乎通过搜索引擎找到了这个问题,根据投票结果,style 2参数似乎更常见,但这并不符合您最初的要求。 - Martin Smith
7个回答

188
以下表达式对我起了作用:
SELECT CONVERT(VARCHAR(1000), varbinary_value, 2);

这里 提供了关于样式(第三个参数)选择的更多细节。


4
如@lara-mayugba所述,style 1的结果包括0x前缀,这可能会很有用。 - Stan
1
@celerno 为什么他们要这样做?这并不能满足他们的需求。 - Martin Smith
1
在2008年之前,使用sys.fn_sqlvarbasetostr(@binaryfield)。 - TheNerdyNerd
@metabuddy - 以什么方式是错误信息?它指出术语“将varbinary转换为varchar”可以通过不同的方式进行,并且这些方式由样式参数控制。仅因为该答案中的样式参数不是您需要的样式参数(但是是回答原始问题的样式参数)并不意味着它是错误信息。 - Martin Smith
1
强调@TheNerdyNerd的评论/答案,表达式应为select sys.fn_sqlvarbasetostr(@b) /* 返回0x5468697320697320612074657374 */。假设将varchar(max)更改为varchar(8000),因为pre-2008不使用它。 - Zachary Scott
我认为@Bilgin Kılıç想要实现的是将内容从varchar解码为varbinary,使用样式2应该会产生不同的答案。 另一方面,使用0模拟此上下文中的答案。 - YungHK

122

将一个varbinary转换为varchar可能有不同的含义。

如果varbinary是SQL Server中字符串的二进制表示(例如直接转换为varbinary或从DecryptByPassPhraseDECOMPRESS函数返回),您可以使用CAST转换它。

declare @b varbinary(max)
set @b = 0x5468697320697320612074657374

select cast(@b as varchar(max)) /*Returns "This is a test"*/

这相当于使用样式参数为0CONVERT函数。

CONVERT(varchar(max), @b, 0)

在其他答案中指出,CONVERT还提供了其他样式参数,以满足不同的需求。


45
这个答案不正确。我在包含用户 SIDs 的表格上进行了测试,转换后的值数量比二进制 SIDs 的数量要少。您应该使用 CONVERT(VARCHAR(...), binaryValue, 2) 来获取唯一值,Gunjan Juyal 的回答是正确的,应该将其标记为解决方案。 - Philipp Munin
16
这两个答案的作用不同。这个答案将像SELECT CAST('This is a test' AS VARBINARY(100)) 这样的表达式的结果(在我的默认排序规则下为0x5468697320697320612074657374)转换回 varchar 字符串。Gunjan的答案会将十六进制表示作为字符串返回('5468697320697320612074657374')。 OP接受了后者这一解释,推测是符合他们需求的。 - Martin Smith
10
这个回答是正确的!我已经测试过它,它可以实现我和原帖作者所需的功能。 - Ronnie Overby
2
@BIDeveloper 如果您已经阅读了上面的评论(特别是我的评论),您应该意识到问题在于“将varbinary转换为varchar”可以有不同的解释。实际上,这就是为什么CONVERT有一个样式参数来选择您想要的方式(我的解释是默认样式)。因此,这个答案可能不是您目前需要的用例,但对于其他用例来说是正确的,包括最初提问者指定的“人类可读形式”,而不是十六进制。 - Martin Smith
1
SQL 2005 可以使用 sys.fn_sqlvarbasetostr(@binary) ,因为对于我来说 CONVERT 将是空的。 - TheNerdyNerd

83

实际上最好的答案是

SELECT CONVERT(VARCHAR(1000), varbinary_value, 1);

使用 "2" 可以去掉 varbinary 开头的 "0x"。


1
@BojieShuai,你是指“我非常同意,甚至无法再同意更多”,还是“我曾经同意,但现在不再这样做”? - howcheng
@howcheng 我的意思是“非常同意”。感谢您指出这一点。 - Bojie Shuai
我曾经同意但现在不再同意。 - Tim

16

试试这个

SELECT CONVERT(varchar(5000), yourvarbincolumn, 0)

7
我必须将第三个参数更改为2,而不是0。我在这里找到了答案:https://dev59.com/wWct5IYBdhLWcg3wXsXH。 - WEFX
1
在我的情况下,我必须使用MAX而不是5000。 - sulaiman sudirman

6

我试过这个方法,对我有效:

declare @b2 VARBINARY(MAX) 
set @b2 = 0x54006800690073002000690073002000610020007400650073007400
SELECT CONVERT(nVARCHAR(1000), @b2, 0);

和我一样,nVARCHAR对我来说比VARCHAR更有效。 - Ram

3

对于 VARBINARY(MAX) 列,我不得不使用 NVARCHAR(MAX)

cast(Content as nvarchar(max))

或者

CONVERT(NVARCHAR(MAX), Content, 0)
VARCHAR(MAX) didn't show the entire value

3
尝试一下下面的内容,因为我很困难。
bcp "SELECT CAST(BINARYCOL AS VARCHAR(MAX)) FROM OLTP_TABLE WHERE ID=123123 AND COMPANYID=123" 
queryout "C:\Users\USER\Documents\ps_scripts\res.txt" -c -S myserver.db.com  -U admin -P password

参考文献:原始帖子

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