将十六进制转换为 varchar

Blu*_*oon 4 sql-server-2008 sql-server type-conversion

我有一列值保存为十六进制。

当我运行此查询时:

select column from  table
where column like '%22639935-KCN%';
Run Code Online (Sandbox Code Playgroud)

这是我得到的输出:

0x24000000008B010000000089FF32323633393933352D4B434E000000
Run Code Online (Sandbox Code Playgroud)

我想将输出转换为 varchar。这应该给我一个类似于 like 语句中的值。

到目前为止,我的尝试是:

SELECT CONVERT(VARCHAR(MAX), 
       0x24000000008B010000000089FF32323633393933352D4B434E000000)


SELECT CONVERT(VARCHAR(MAX), CONVERT(VARBINARY(MAX), 
       '0x24000000008B010000000089FF32323633393933352D4B434E000000', 2))
Run Code Online (Sandbox Code Playgroud)

但是,我得到了这个结果:

$

如何将此十六进制值转换为 varchar?

Aar*_*and 8

看起来你的 varbinary 字符串被注入了一些废话。两个00值的所有序列都是空字符,因此这就是您的字符串在转换时终止的原因。第一个字符是0x24(美元符号),这就是为什么输出只是一个美元符号。

SELECT CONVERT(varchar(60), 0x2400....anything....);
-- is equivalent to:
SELECT CONVERT(varchar(60), 0x24);
Run Code Online (Sandbox Code Playgroud)

现在,如果我把你的字符串去掉所有的00序列:

SELECT CONVERT(VARCHAR(60), 0x248B0189FF32323633393933352D4B434E);
Run Code Online (Sandbox Code Playgroud)

我得到了一些接近的东西;再次,还有一堆在那里的垃圾,但你后面的字符串在那里:

$‹‰ÿ22639935-KCN
Run Code Online (Sandbox Code Playgroud)

您可以通过仅获取原始值并对其执行操作来忽略前导垃圾RIGHT(),但这假设字符串的重要部分始终具有相同的长度(我们无法告诉您这是不是真的)。

SELECT CONVERT(VARCHAR(60),     
       RIGHT(0x24000000008B010000000089FF32323633393933352D4B434E000000, 15));
Run Code Online (Sandbox Code Playgroud)

或者使用SUBSTRING,但这假设字符串开头的垃圾总是相同的长度:

SELECT CONVERT(VARCHAR(60), 
       SUBSTRING(0x24000000008B010000000089FF32323633393933352D4B434E000000, 14, 46));
Run Code Online (Sandbox Code Playgroud)

我们也无法告诉您为什么会有这些垃圾以及它是否有任何其他含义。您首先需要找出值是如何以这种方式编码的。您想要编码的值22639935-KCN, 应该看起来有点不同varbinary

SELECT CONVERT(VARBINARY(32), '22639935-KCN');

--------------------------
0x32323633393933352D4B434E
Run Code Online (Sandbox Code Playgroud)

因此,同样,您将需要进行一些研究以找出该值未以这种方式编码的原因。我们无法回答所有这些,因为我们没有设计您的系统或存储这些值。