首页 > 解决方案 > SQL 选择从十六进制转换为 ASCII/varchar

问题描述

我将数据存储在 SQL Server 表的列中,如下所示:

0x003600380032003200330031002D003400

我知道这个输出应该是:

682231-4

有人可以帮我转换 SQL 代码吗?

就像是:

 select converttochar (0x003600380032003200330031002D003400)

退货:682231-4

我不确定我是在看十六进制还是二进制转换还是什么....

标签: sqlsql-server

解决方案


这实际上看起来像你在开始时nvarchar有一个领先00。这很混乱,但会起作用:

SELECT CONVERT(nvarchar(30),CONVERT(varbinary(60),STUFF(CONVERT(VARCHAR(60), 0x003600380032003200330031002D003400,1),3,2,''),1));

这会去除前导00字符,生成 value 0x3600380032003200330031002D003400nvarcharN'682231-4'

它通过将 a 转换varbinary为 avarchar但使用样式代码来去除值1,这意味着您有 avarchar的值'0x3600380032003200330031002D003400';允许您执行字符串操作。然后我使用STUFF删除字符并CONVERT使用样式代码1使其varbinary再次成为一个。

DB<>小提琴

或者,您可以删除所有空字符元组并进行转换。这看起来更混乱,因为你不能只是一揽子替换'00'(或者我觉得它不“安全”),所以我将字符放入他们的元组中,然后重建:

DECLARE @YourBinary varbinary(60) = 0x003600380032003200330031002D003400;

WITH N AS(
    SELECT N
    FROM (VALUES(NULL),(NULL),(NULL),(NULL),(NULL),(NULL))N(N)),
Tally AS(
    SELECT TOP(60) ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) -1 AS I
    FROM N N1, N N2, N N3)
SELECT CONVERT(varchar(60),CONVERT(varbinary(60),(SELECT V.SS + ''
                                                  FROM Tally T
                                                       CROSS APPLY(VALUES(SUBSTRING(CONVERT(varchar(60),@YourBinary,1),(T.I*2)+1,2)))V(SS)
                                                  WHERE V.SS NOT IN ('00','')
                                                  FOR XML PATH(''),TYPE).value('.','varchar(60)'),1));

但是,如果您的某些价值观具有领先地位00而其他价值观却没有,那么这个想法可能会更好。当然,此解决方案还假设最终值为 a varchar,而不是 a nvarchar


推荐阅读