Sql-Server

將十六進制轉換為 varchar

  • July 25, 2020

我有一列值保存為十六進制。

當我執行此查詢時:

select column from  table
where column like '%22639935-KCN%';

這是我得到的輸出:

0x24000000008B010000000089FF32323633393933352D4B434E000000

我想把輸出變成一個varchar。這應該給我一個類似於 like 語句中的值。

到目前為止,我的嘗試是:

SELECT CONVERT(VARCHAR(MAX), 
      0x24000000008B010000000089FF32323633393933352D4B434E000000)


SELECT CONVERT(VARCHAR(MAX), CONVERT(VARBINARY(MAX), 
      '0x24000000008B010000000089FF32323633393933352D4B434E000000', 2))

但是,我得到了這個結果:

$

如何將此十六進制值轉換為 varchar?

看起來你的 varbinary 字元串被注入了一些廢話。兩個值的所有序列00都是空字元,因此這就是您的字元串在轉換時終止的原因。第一個字元是0x24(美元符號),這就是為什麼輸出只是一個美元符號。

SELECT CONVERT(varchar(60), 0x2400....anything....);
-- is equivalent to:
SELECT CONVERT(varchar(60), 0x24);

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

SELECT CONVERT(VARCHAR(60), 0x248B0189FF32323633393933352D4B434E);

我得到了一些接近;再一次,那裡有一堆垃圾,但是你要的字元串那裡:

$‹‰ÿ22639935-KCN

您可以通過僅獲取原始值並對其執行來忽略前導垃圾RIGHT(),但這假設字元串的重要部分始終是相同的長度(我們無法告訴您這是否屬實)。

SELECT CONVERT(VARCHAR(60),     
      RIGHT(0x24000000008B010000000089FF32323633393933352D4B434E000000, 15));

或使用SUBSTRING,但這假設字元串開頭的垃圾總是相同的長度:

SELECT CONVERT(VARCHAR(60), 
      SUBSTRING(0x24000000008B010000000089FF32323633393933352D4B434E000000, 14, 46));

我們也無法告訴你為什麼會有這些垃圾,以及它是否有任何額外的含義。您首先需要了解這些值是如何以這種方式編碼的。您想要編碼的值,22639935-KCN,應該看起來有點不同varbinary

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

--------------------------
0x32323633393933352D4B434E

因此,再次,您需要做一些研究來找出為什麼這個值沒有以這種方式編碼。我們無法回答所有這些問題,因為我們沒有設計您的系統或儲存這些值。

引用自:https://dba.stackexchange.com/questions/132996