代码之家  ›  专栏  ›  技术社区  ›  csauve

varchar()中的十六进制字符实际上是ASCII。需要解码它

  •  5
  • csauve  · 技术社区  · 14 年前

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

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

    字段内容:“3835333343738622D393030302D343732392D383436622D383161336634396339663931”

    实际代表的是:“8534788B-9000-4729-846B-81A3F49C9F91”

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

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

    例如:update mytable set myfield=myfunction(myfield)

    其中myfunction是这个问题的正确答案。

    2 回复  |  直到 14 年前
        1
  •  6
  •   SQLMenace    14 年前

    这会给你你想要的…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 + ')')
    
        2
  •  1
  •   Hans Olsson    14 年前

    如果要转换单个字符,可以使用 CHAR 功能如下:

    SELECT CHAR(0x38)
    

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