【问题标题】:varbinary to string on SQL Servervarbinary 到 SQL Server 上的字符串
【发布时间】:2011-03-18 10:15:47
【问题描述】:

如何以人类可读的形式将列值从varbinary(max) 转换为varchar

【问题讨论】:

  • 我想要 varchar,因为该值是从字符串值中提取的。我的意思是阅读所写的内容..
  • @MartinSmith ppl 推动我改变。所以再次标记你的答案。谢谢你的好意。
  • 人们似乎是从搜索引擎中发现的,并且根据投票,样式 2 参数似乎更常见,但这并不符合您的原始要求

标签: sql sql-server sql-server-2005 tsql


【解决方案1】:

试试这个

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

【讨论】:

  • 我不得不使用 2 作为我的第三个参数,而不是零。我找到了答案here
  • 在我的情况下,我必须使用 MAX 而不是 5000
【解决方案2】:

“将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"*/

这相当于使用CONVERT0 样式参数。

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

CONVERT 提供了其他样式参数,以满足其他答案中所述的不同要求。

【讨论】:

  • 这个答案不正确。我使用用户 SID 在表上对其进行了测试 - Distinct 转换值的数量少于 Distinct 二进制 SID 的数量。您应该使用 CONVERT(VARCHAR(...), binaryValue, 2) 来获得唯一值 - Gunjan Juyal 的答案是正确的 - 它应该被标记为解决方案
  • @PhilippMunin - 这两个答案做不同的事情。这会获取诸如SELECT CAST('This is a test' AS VARBINARY(100)) 之类的表达式的结果,在我的默认排序规则中它是0x5468697320697320612074657374,并将其转换回varchar 字符串。 Gunjan 的回答将十六进制表示形式返回为字符串 ('5468697320697320612074657374') 大概这种解释对于 OP 的需要是正确的,因为他们接受了它。
  • 这个答案是正确的!我对其进行了测试,它可以满足我和 OP 的要求。
  • @BIDeveloper 如果您阅读过上面的 cmets(特别是我的 cmets),您应该意识到问题是“将 varbinary 转换为 varchar”可以用不同的方式解释。确实这就是为什么CONVERT 有一个样式参数来选择您想要的方式(我的解释是默认样式)所以这个答案可能不是您目前的用例所需要的,但它对于其他用例是正确的。包括指定“人类可读形式”而不是十六进制的原始提问者。
  • SQL 2005 你可以使用 sys.fn_sqlvarbasetostr(@binary) 因为 CONVERT 对我来说是空白的
【解决方案3】:

以下表达式对我有用:

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

Here是更多关于样式选择的细节(第三个参数)。

【讨论】:

  • 如下@lara-mayugba 所述,样式 1 在结果中包含 0x 前缀,这可能很有用..
  • @celerno 他们为什么会这样?这不能满足他们的需要。
  • 2008 年之前使用 sys.fn_sqlvarbasetostr(@binaryfield)
  • @metabuddy - 以何种方式是错误信息?它指出术语“将 varbinary 转换为 varchar”可以以不同的方式完成,并且这些由 style 参数控制。仅仅因为该答案中的样式参数不是您的案例所需的参数(而是回答原始问题的参数)并不会使其成为错误信息
  • 为了强调@TheNerdyNerd 的评论/答案,表达式将是`select sys.fn_sqlvarbasetostr(@b) /* 返回 0x5468697320697320612074657374 */ 假设一个将 varchar(max) 更改为 varchar(8000) 因为2008 年之前不使用它。
【解决方案4】:

其实最好的答案是

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

使用“2”在varbinary的开头截断“0x”。

【讨论】:

  • @BojieShuai 你的意思是“我非常同意,我不可能再同意了”,还是“我曾经同意但现在不再同意”?
  • @howcheng 我的意思是“不能同意更多”。感谢您指出这一点。
  • “我以前同意,但现在不同意”将是“我不同意不再”(一个字,不是“不再”,两个字)。 Anymore any more。任何SPACE more =“更大程度或程度”。
【解决方案5】:

对于VARBINARY(MAX) 列,我必须使用NVARCHAR(MAX)

cast(Content as nvarchar(max))

或者

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

【讨论】:

    【解决方案6】:

    我试过了,它对我有用:

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

    【讨论】:

      【解决方案7】:

      在我努力的时候试试下面的内容

      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
      

      参考:original post

      【讨论】:

        猜你喜欢
        • 2012-12-18
        • 1970-01-01
        • 1970-01-01
        • 2011-06-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多