SQL Server:XML中十六进制值的编码?

时间:2017-05-10 16:13:47

标签: sql-server xml

当我将十六进制值转储到SQL Server的XML输出中时,例如

0x103319FF9ABAF2EC14E1432479DA3CDBC8B2DEF8

我明白了:

/DNcECEQkcDhcAkP/56jm/XHKQk=

看起来它已被编码为base64,但我尝试了不同的转换器,并且无法将第二个值重新转换为第一个值。有谁知道SQL Server如何编码XML中的十六进制值?

3 个答案:

答案 0 :(得分:1)

您可以使用以下方法将VARBINARY值编码/解码为XML

DECLARE @vb VARBINARY(100) = 0x103319FF9ABAF2EC14E1432479DA3CDBC8B2DEF8
SELECT @vb AS vb
FOR XML RAW, BINARY BASE64
/*
XML_F52E2B61-18A1-11d1-B105-00805F49916B
----------------------------------------
<row vb="EDMZ/5q68uwU4UMkedo828iy3vg="/>
*/

DECLARE @x XML = N'<row vb="EDMZ/5q68uwU4UMkedo828iy3vg="/>'
SELECT @x.value('(row/@vb)[1]', 'VARBINARY(100)') AS VBValueFromXML
/*
VBValueFromXML
------------------------------------------
0x103319FF9ABAF2EC14E1432479DA3CDBC8B2DEF8
*/

答案 1 :(得分:1)

一种方法是使用hexToBinary函数:

DECLARE @table TABLE(BinaryValue varbinary(MAX));
INSERT INTO @table(BinaryValue) VALUES(0x103319FF9ABAF2EC14E1432479DA3CDBC8B2DEF8);
SELECT
    CAST('' AS XML).value('xs:hexBinary(sql:column("BinaryValue"))', 'varchar(MAX)') AS HexString
FROM @table;

这将返回不带0x前缀的十六进制数字字符串:

103319FF9ABAF2EC14E1432479DA3CDBC8B2DEF8

答案 2 :(得分:1)

  

看起来它已被编码为base64,[...]无法重新转换[...]   有谁知道SQL Server如何编码XML中的十六进制值?

这是BLOB(二进制数据)的标准行为。这不是很早的时候,但是 - AFAIK--自SS2005以来它是:

任何二进制值都会隐式转换为base64表示形式:

DECLARE @YourBinary VARBINARY(MAX)=0x103319FF9ABAF2EC14E1432479DA3CDBC8B2DEF8;

DECLARE  @xml XML =
(
    SELECT @YourBinary FOR XML PATH('test')
);

SELECT @xml;

- 返回

<test>EDMZ/5q68uwU4UMkedo828iy3vg=</test>

当您指定正确的目标类型时,此值会隐式重新转换为真实二进制

SELECT @xml.value(N'(/test/text())[1]','varbinary(max)')

可能是,您正在混合实际二进制值,显示为十六进制字符串 和一个十六进制字符串,这是一个字符串(字符行)实际上

看看数字。在XML中,您可以看到写入的数字,但是 - 您肯定知道 - 数字数据类型不会存储为数字行。在XML中,任何数据都将转换为具有已定义格式的字符串表示。读取此数据需要重新转换回原始数据类型

如果你真的需要十六进制字符串作为一行十六进制字符,你可以使用Dan Guzman的建议。

更新:使用FOR XML RAWFOR XML AUTO进行特殊处理:

在与Bogdan Sahlean讨论之后,我想补充一点,在大多数情况下,你会想要使用FOR XML PATH。但是 - 在某些情况下 - 可以选择使用EXPLICITRAWAUTO(尽管这种情况很少见......)。这些模式需要一个特殊的标记来处理二进制数据:

SELECT 0x01 AS x FOR XML RAW, BINARY BASE64 --breaks without ", BINARY BASE64"

一些细节here