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?
看起来你的 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)
因此,同样,您将需要进行一些研究以找出该值未以这种方式编码的原因。我们无法回答所有这些,因为我们没有设计您的系统或存储这些值。
| 归档时间: |
|
| 查看次数: |
44966 次 |
| 最近记录: |