SQL Server 2005 T-SQL中的Base64编码

Jac*_*cob 116 t-sql base64 encoding sql-server-2005

我想编写一个T-SQL查询,我将字符串编码为Base64字符串.令人惊讶的是,我找不到任何用于执行Base64编码的本机T-SQL函数.是否存在本机功能?如果没有,在T-SQL中进行Base64编码的最佳方法是什么?

mer*_*ial 179

我知道这已经得到了解答,但是我花了更多的时间来承认用单行SQL语句来完成这个,所以我会在这里分享它们以防其他人需要做同样的事情:

-- Encode the string "TestData" in Base64 to get "VGVzdERhdGE="
SELECT
    CAST(N'' AS XML).value(
          'xs:base64Binary(xs:hexBinary(sql:column("bin")))'
        , 'VARCHAR(MAX)'
    )   Base64Encoding
FROM (
    SELECT CAST('TestData' AS VARBINARY(MAX)) AS bin
) AS bin_sql_server_temp;

-- Decode the Base64-encoded string "VGVzdERhdGE=" to get back "TestData"
SELECT 
    CAST(
        CAST(N'' AS XML).value(
            'xs:base64Binary("VGVzdERhdGE=")'
          , 'VARBINARY(MAX)'
        ) 
        AS VARCHAR(MAX)
    )   ASCIIEncoding
;
Run Code Online (Sandbox Code Playgroud)

我不得不在第一个(编码)查询中使用子查询生成的表,因为我找不到任何方法将原始值("TestData")转换为其十六进制字符串表示形式("5465737444617461")以包含作为参数xs:XQuery语句中的hexBinary().

我希望这可以帮助别人!

  • 编码时,`xs:base64Binary(sql:column("bin"))`(不带`xs:hexBinary`调用)也可以.很好的帮助! (6认同)
  • 因为有时人们需要在软件中完成某些事情,原因是你不能总是预测......? (6认同)
  • 要支持unicode文本的编码,你应该在_TestData_前添加'N':'SELECT CAST(**N**'TestData'AS VARBINARY(MAX))AS bin' (3认同)
  • @hsuk varchar与Unicode无法兼容.如果使用nvarchar(max),它可以正常工作,例如:`SELECT CAST(CAST(N''AS XML).value('xs:base64Binary("LgkoCU0JJAlNCTAJQAkyCUcJIAAJCTIJTQkfCU0JLwk + ​​CQ8JIAA4CT4JJAkgABsJKAlNCWQJ")','VARBINARY(MAX)')AS NVARCHAR(MAX))UnicodeEncoding;` (3认同)

Sla*_*lai 75

我能为SQL Server 2012及以上版本找到的最简单,最简单的方法是BINARY BASE64:

SELECT CAST('string' as varbinary(max)) FOR XML PATH(''), BINARY BASE64
Run Code Online (Sandbox Code Playgroud)

对于Base64来串

SELECT CAST( CAST( 'c3RyaW5n' as XML ).value('.','varbinary(max)') AS varchar(max) )
Run Code Online (Sandbox Code Playgroud)

(或nvarchar(max)用于Unicode字符串)

  • 这比其他答案简单得多,并且效果也一样 (3认同)
  • BINARY BASE64在第一线的目的是什么?需要它吗?我尝试了没有,似乎给出了相同的结果. (2认同)
  • 这应该是答案,因为实际答案需要字符串文字,并且不能接受像这样的答案可以的变量. (2认同)
  • 对于base64到string,我注意到.value('data [1]','varbinary(max)')副.value('.','varbinary(max)')的显着性增益. (2认同)

Joe*_*ari 22

这是对mercurial的答案的修改,该答案在解码时也使用子查询,允许在两个实例中使用变量.

DECLARE
    @EncodeIn VARCHAR(100) = 'Test String In',
    @EncodeOut VARCHAR(500),
    @DecodeOut VARCHAR(200)    

SELECT @EncodeOut = 
    CAST(N'' AS XML).value(
          'xs:base64Binary(xs:hexBinary(sql:column("bin")))'
        , 'VARCHAR(MAX)'
    )
FROM (
    SELECT CAST(@EncodeIn AS VARBINARY(MAX)) AS bin
) AS bin_sql_server_temp;

PRINT @EncodeOut

SELECT @DecodeOut = 
CAST(
    CAST(N'' AS XML).value(
        'xs:base64Binary(sql:column("bin"))'
      , 'VARBINARY(MAX)'
    ) 
    AS VARCHAR(MAX)
) 
FROM (
    SELECT CAST(@EncodeOut AS VARCHAR(MAX)) AS bin
) AS bin_sql_server_temp;

PRINT @DecodeOut
Run Code Online (Sandbox Code Playgroud)


Ole*_*leg 21

以下是将完成工作的函数的代码

-- To Base64 string
CREATE FUNCTION [dbo].[fn_str_TO_BASE64]
(
    @STRING VARCHAR(MAX)
)
RETURNS VARCHAR(MAX)
AS
BEGIN
    RETURN (
        SELECT
            CAST(N'' AS XML).value(
                  'xs:base64Binary(xs:hexBinary(sql:column("bin")))'
                , 'VARCHAR(MAX)'
            )   Base64Encoding
        FROM (
            SELECT CAST(@STRING AS VARBINARY(MAX)) AS bin
        ) AS bin_sql_server_temp
    )
END
GO

-- From Base64 string
CREATE FUNCTION [dbo].[fn_str_FROM_BASE64]
(
    @BASE64_STRING VARCHAR(MAX)
)
RETURNS VARCHAR(MAX)
AS
BEGIN
    RETURN (
        SELECT 
            CAST(
                CAST(N'' AS XML).value('xs:base64Binary(sql:variable("@BASE64_STRING"))', 'VARBINARY(MAX)') 
            AS VARCHAR(MAX)
            )   UTF8Encoding
    )
END
Run Code Online (Sandbox Code Playgroud)


Jas*_*n W 8

我喜欢@Slai的回答.我只需要对我正在寻找的单行进行非常小的修改.我想我会分享我最终得到的东西,以防它帮助其他人像我一样绊到这个页面:

DECLARE @Source VARCHAR(50) = '12345'
DECLARE @Encoded VARCHAR(500) = CONVERT(VARCHAR(500), (SELECT CONVERT(VARBINARY, @Source) FOR XML PATH(''), BINARY BASE64))
DECLARE @Decoded VARCHAR(500) = CONVERT(VARCHAR(500), CONVERT(XML, @Encoded).value('.','varbinary(max)'))
SELECT @Source AS [Source], @Encoded AS [Encoded], @Decoded AS [Decoded]
Run Code Online (Sandbox Code Playgroud)