【问题标题】:SQL string to varbinary through XML different than nvarchar通过 XML 转换为 varbinary 的 SQL 字符串与 nvarchar 不同
【发布时间】:2020-07-06 12:29:53
【问题描述】:

我们目前在 SQL 中有一个我根本不理解的函数。

目前我们将 nvarchar 转换为 XML,然后选择 XML 值,并将其转换为 varbinary。

当我尝试简化此操作以将 nvarchar 直接转换为 varbinary 时,输出不同...为什么?

--- Current situation:
Declare @inputString nvarchar(max) = '4d95605d1b8f3bca5ea3e0d2af26027004d17218152e726da0622d669a71f85c'

--1: input to XML
declare @inputXML XML = convert(varchar(max), @inputString)

--2: input XML to binary
declare @inputBinray varbinary(max) = @inputXML.value('(/)[1]', 'varbinary(max)')

select @inputString -- 4d95605d1b8f3bca5ea3e0d2af26027004d17218152e726da0622d669a71f85c
select @inputXML -- 4d95605d1b8f3bca5ea3e0d2af26027004d17218152e726da0622d669a71f85c
select @inputBinray -- 0xE1DF79EB4E5DD5BF1FDDB71AE5E6B77B477669FDBAD36EF4D38775EF6D7CD79D9EEF6E9D6B4EB6D9DEBAF5AEF57FCE5C
--- New situation
--1: Input to binary
declare @inputString2 varbinary(max) = CAST(@inputString as varbinary(max));

select @inputString2 -- 0x3400640039003500360030003500640031006200380066003300620063006100350065006100330065003000640032006100660032003600300032003700300030003400640031003700320031003800310035003200650037003200360064006100300036003200320064003600360039006100370031006600380035006300

【问题讨论】:

    标签: sql-server tsql varbinary


    【解决方案1】:

    使用value() 函数获取指定为varbinary(max) 的XML 值将读取数据,就好像它是Base64 编码的一样。将字符串转换为 varbinary(max) 不会,它会将其视为任何字符串。

    如果您使用输入字符串 QQA=,即编码为 Base64 的 UTF-16 LE 中的字母 A,您会更清楚地看到发生了什么。

    XML 给你0x4100,字母A 的varbinary,直接在字符串上转换给你0x5100510041003D00,你有两个5100 = "Q",当然还有一个4100 = "A",后面跟着一个3D00 = "="

    【讨论】:

      【解决方案2】:

      可能是我弄错了,但是 - 如果我理解正确 - 我认为你只是想从 HEX 字符串中获取 真正的二进制,它只是 看起来 像一个二进制文件。对吗?

      上面我写了“简单”,但前段时间一点都不简单。

      目前我不确定,但我认为它是 v2012 版本,它增强了 CONVERT()(了解二进制值和第三个参数的工作原理)并试试这个:

      DECLARE @hexString VARCHAR(max)='4d95605d1b8f3bca5ea3e0d2af26027004d17218152e726da0622d669a71f85c';
      
      SELECT CONVERT(varbinary(max),@hexString,2);
      

      结果是真正的二进制

      0x4D95605D1B8F3BCA5EA3E0D2AF26027004D17218152E726DA0622D669A71F85C
      

      您的问题可能是什么原因:

      很久以前,我认为直到 v2005,XML 中 varbinaries 的默认编码是 HEX 字符串。后来这被改为base64。可能是您的代码在非常旧的环境中使用并升级到更高版本?

      今天我们以类似的方式使用 XML 来创建和读取 base64,否则不支持。也许您的代码对 HEX 字符串做了类似的事情...?

      对此的另一个提示:您的 New Situation 示例中的许多 00 清楚地表明,这是一个两字节编码的 NVARCHAR 字符串。相反,您的 Current Situation 显示了一个简单的 HEX 字符串。

      您的最终结果只是您作为字符串输入的二进制模式:

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-05-30
        • 2012-12-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-06-24
        相关资源
        最近更新 更多