Sql server 2005 SQL Server 2005 T-SQL中的Base64编码

Sql server 2005 SQL Server 2005 T-SQL中的Base64编码,sql-server-2005,tsql,encoding,base64,Sql Server 2005,Tsql,Encoding,Base64,我想编写一个T-SQL查询,将字符串编码为Base64字符串。令人惊讶的是,我找不到任何用于Base64编码的本机t-SQL函数。是否存在本机函数?如果没有,在T-SQL中进行Base64编码的最佳方法是什么?没有,没有本机函数,这种方法过去对我很有效: 这个方法也是如此: 我知道这已经得到了回答,但我只是花了比我愿意承认的更多的时间来实现这一点,所以我将在这里分享它们,以防其他人也需要这样做: -- Encode the string "TestData" in Base64 to get

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

没有,没有本机函数,这种方法过去对我很有效:
这个方法也是如此:

我知道这已经得到了回答,但我只是花了比我愿意承认的更多的时间来实现这一点,所以我将在这里分享它们,以防其他人也需要这样做:

-- 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
;
在第一个(编码)查询中,我必须使用子查询生成的表,因为我找不到任何方法将原始值(“TestData”)转换为十六进制字符串表示形式(“5465737444617461”),以便在XQuery语句中包含xs:hexBinary()的参数


我希望这对别人有帮助

这里是对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
这对于编码和解码非常有用


Bharat J

以下是将执行此工作的函数的代码

-- To Base64 string
CREATE FUNCTION [dbo].[fn_str_TO_BASE64]
(
    @STRING NVARCHAR(MAX)
)
RETURNS NVARCHAR(MAX)
AS
BEGIN
    RETURN (
        SELECT
            CAST(N'' AS XML).value(
                  'xs:base64Binary(xs:hexBinary(sql:column("bin")))'
                , 'NVARCHAR(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 NVARCHAR(MAX)
)
RETURNS NVARCHAR(MAX)
AS
BEGIN
    RETURN (
        SELECT 
            CAST(
                CAST(N'' AS XML).value('xs:base64Binary(sql:variable("@BASE64_STRING"))', 'VARBINARY(MAX)') 
            AS NVARCHAR(MAX)
            )   UTF8Encoding
    )
END
用法示例:

DECLARE @CHAR NVARCHAR(256) = N'e.g., سلام جیران or В России'
SELECT [dbo].[fn_str_FROM_BASE64]([dbo].[fn_str_TO_BASE64](@CHAR)) as converted

对于SQL Server 2012及更高版本,我能找到的最简单、最短的方法是:

将Base64转换为字符串

SELECT CAST( CAST( 'c3RyaW5n' as XML ).value('.','varbinary(max)') AS varchar(max) )

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

我喜欢@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]

我编写了一个脚本,将base64中编码的现有哈希转换为十进制,它可能很有用:

SELECT LOWER(SUBSTRING(CONVERT(NVARCHAR(42), CAST( [COLUMN_NAME] as XML ).value('.','varbinary(max)'), 1), 3, 40)) from TABLE
您可以只使用:

Declare @pass2 binary(32)
Set @pass2 =0x4D006A00450034004E0071006B00350000000000000000000000000000000000
SELECT CONVERT(NVARCHAR(16), @pass2)

编码后,您将收到文本“MjE4Nqk5”

从上述所有答案中提取内容,以下是我的想法

基本上有两种方法可以做到这一点:

;WITH TMP AS (
    SELECT CAST(N'' AS XML).value('xs:base64Binary(xs:hexBinary(sql:column("bin")))', 'VARCHAR(MAX)') as  Base64Encoding
    FROM 
    (
        SELECT TOP 10000 CAST(Words AS VARBINARY(MAX)) AS bin FROM TestData
    ) SRC
) 

SELECT *, CAST(CAST(N'' AS XML).value('xs:base64Binary(sql:column("Base64Encoding"))', 'VARBINARY(MAX)') AS NVARCHAR(MAX)) as ASCIIEncoding
FROM
(
    SELECT * FROM TMP
) SRC

第二条路呢

;WITH TMP AS 
(
    SELECT TOP 10000 CONVERT(VARCHAR(MAX), (SELECT CAST(Wordsas varbinary(max)) FOR XML PATH(''))) as BX
    FROM TestData
)

SELECT *, CONVERT(NVARCHAR(MAX), CONVERT(XML, BX).value('.','varbinary(max)'))
FROM TMP


在比较性能时,第一个模型的子树成本为2.4414,第二个模型的子树成本为4.1538。这意味着第一个链接的速度大约是第二个的两倍(这是预期的,因为它使用XML,这是出了名的慢)。

第二个链接中的文章非常方便。非常感谢。是的,第二个链接非常有用,我知道它很旧,但是你能介绍一下本文中文章/方法的要点吗?编码时,
xs:base64Binary(sql:column(“bin”)
(没有
xs:hexBinary
调用)也可以工作。帮了大忙!为了支持unicode文本的编码,您应该在TestData前面添加'N':'SELECT CAST(N'TestData'作为VARBINARY(MAX))作为bin'不适用于unicode文本。。。选择强制转换(N''为XML).value('xs:base64Binary(xs:hexBinary(sql:column(“bin”))),'VARCHAR(MAX'))Base64Encoding FROM(选择强制转换(N'मन्त्रीले उल्ट्याए सात छन्।' 作为VARBINARY(MAX))作为bin)作为bin\u sql\u server\u temp@hsuk varchar与Unicode不兼容。如果改用nvarchar(max),它可以正常工作,例如:
SELECT CAST(CAST(N''为XML)。value('xs:base64Binary(“lgkocu0jjalnctajtqkfcu0jlwk+cq8jiaa4ct4c4jjakgabsjkalncwqj”),'VARBINARY(max')作为nvarchar(max)Unideencoding因为有时人们需要在软件中完成某些事情,原因是您无法始终预测?我想知道为什么数据应该存储为base64字符串。在http上使用base64有一个很好的理由,即它确保了只支持ASCII字符集(并且将所有数据都视为文本)的系统之间的互操作性。您可以轻松地将字节数组转换为base-64,反之亦然,那么为什么不高效地存储数据呢?我甚至见过人们在nvarchar列中存储base64字符串,这占用了varbinary 275%的空间,导致了磁盘、ram、网络等的浪费。这是关于生成base64字符串,而不是存储一个。这比其他答案简单得多,而且效果也一样。第一行中二进制base64的用途是什么?需要吗?我尝试不使用,但它似乎给出了相同的结果;我将“varbinary”更改为“varbinary(max)”,缺少的字符也放在适当的位置。这应该是答案,因为实际答案需要字符串文本,并且不能接受类似于此答案的变量。对于base64 to string,我注意到.value('data[1],'varbinary(max)')与.value('..,'varbinary(max)')的性能显著提高。对我来说,我需要将第二行
VARBINARY
更改为
VARBINARY(56)
,然后它就工作了。最短解决方案,与SQL Server 2005+兼容。非常好。我在生成随机测试数据时使用了这个。我使用它将无法打印的字符从
crypt\u gen\u random(N)
转换为更可读的内容:
selectconvert(VARCHAR(MAX),(selectcrypt\u gen\u random(20)表示XML路径(“”),BINARY BASE64))
。通常很有用。这没有处理任何字符,如波斯语和俄语,或表情符号。e、 g、B、B、B、B、B、B、B、B、B、B、B、B、B、B、B、B、B、B、B、B、B、B、B、B、B、B、B、B、B、B、B、B、B、B、B❤️你说得对。它在将varchar替换为nvarchar后进行处理
;WITH TMP AS (
    SELECT CAST(N'' AS XML).value('xs:base64Binary(xs:hexBinary(sql:column("bin")))', 'VARCHAR(MAX)') as  Base64Encoding
    FROM 
    (
        SELECT TOP 10000 CAST(Words AS VARBINARY(MAX)) AS bin FROM TestData
    ) SRC
) 

SELECT *, CAST(CAST(N'' AS XML).value('xs:base64Binary(sql:column("Base64Encoding"))', 'VARBINARY(MAX)') AS NVARCHAR(MAX)) as ASCIIEncoding
FROM
(
    SELECT * FROM TMP
) SRC

;WITH TMP AS 
(
    SELECT TOP 10000 CONVERT(VARCHAR(MAX), (SELECT CAST(Wordsas varbinary(max)) FOR XML PATH(''))) as BX
    FROM TestData
)

SELECT *, CONVERT(NVARCHAR(MAX), CONVERT(XML, BX).value('.','varbinary(max)'))
FROM TMP