【问题标题】:Hex characters in varchar() is actually ascii. Need to decode itvarchar() 中的十六进制字符实际上是 ascii。需要解码
【发布时间】:2011-02-23 21:01:37
【问题描述】:

这是一个问题的边缘情况,如果有一种简单的方法可以做到这一点,我会感到惊讶。

我有一个带有 varchar(255) 类型字段的 MS SQL DB。它包含一个十六进制字符串,当您使用 ascii 解码器对其进行解码时,它实际上是一个 Guid。我知道这听起来很奇怪,但这里有一个例子:

字段内容:“38353334373838622D393030302D343732392D383436622D383161336634396339663931”

它实际代表什么:“8534788b-9000-4729-846b-81a3f49c9f91”

我需要一种方法来对此进行解码,只需将字段的内容更改为它所代表的实际 guid。我需要在 T-SQL 中执行此操作,我不能使用 .Net(如果可以的话,这非常简单)。

UPDATE:有些人已经用一次性语句的方式做出了回应,我需要一种方法将其放入 UPDATE 语句中。

例如:UPDATE MyTable SET MyField = MyFunction(MyField)

MyFunction 是这个问题的正确答案。

【问题讨论】:

    标签: sql encoding ascii hex decoding


    【解决方案1】:

    这会给你你想要的..8534788b-9000-4729-846b-81a3f49c9f91

    select CONVERT(varchar(36),
    0x38353334373838622D393030302D343732392D383436622D383161336634396339663931)
    

    您需要将值转换为 varbinary,然后再转换回 varchar

    这是使用动态 SQL 的一种方式

        declare @v varchar(100)
     select @v = '0x' + '38353334373838622D393030302D343732392D383436622D383161336634396339663931'
    
    exec ( 'SELECT CONVERT(varchar(36),' + @v + ')')
    

    【讨论】:

    • 这让我成功了一半,但我如何到达 varbinary?如果我选择 convert(varbinary(max),'FF') 它给我 0x4646,在我的情况下字符串应该是 0xFF
    • 谢谢!这肯定行得通,我没有考虑使用动态 SQL。 :)
    【解决方案2】:

    如果你想转换单个字符,你可以使用CHAR 函数来实现:

    SELECT CHAR(0x38)
    

    但是你必须记住在数字前加上 0x,因为它是十六进制的。

    【讨论】:

      猜你喜欢
      • 2016-06-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-01-02
      相关资源
      最近更新 更多