web-dev-qa-db-ger.com

Base64-Codierung in SQL Server 2005 T-SQL

Ich möchte eine T-SQL-Abfrage schreiben, in der ich eine Zeichenfolge als Base64-Zeichenfolge kodiere. Überraschenderweise kann ich keine nativen T-SQL-Funktionen für die Base64-Codierung finden. Gibt es eine native Funktion? Wenn nicht, was ist der beste Weg, die Base64-Codierung in T-SQL durchzuführen?

106
Jacob

Ich weiß, dass dies bereits beantwortet wurde, aber ich habe einfach mehr Zeit aufgewendet, als ich zugeben wollte, dass ich einzeilige SQL-Anweisungen für diesen Zweck entwickelt habe. Deshalb werde ich sie hier weitergeben, falls jemand anderes dasselbe tun muss:

-- 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
;

Ich musste eine in einer Unterabfrage generierte Tabelle in der ersten (Kodierungs-) Abfrage verwenden, da ich keine Möglichkeit fand, den ursprünglichen Wert ("TestData") in seine Hex-String-Darstellung ("5465737444617461") zu konvertieren, um das Argument als einzufügen xs: hexBinary () in der XQuery-Anweisung.

Ich hoffe das hilft jemandem!

169
mercurial

Der einfachste und kürzeste Weg, den ich für SQL Server 2012 und höher finden könnte, ist BINARY BASE64 :

SELECT CAST('string' as varbinary(max)) FOR XML PATH(''), BINARY BASE64

Für Base64 als Zeichenfolge

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

(oder nvarchar(max) für Unicode-Zeichenfolgen)

66
Slai

Hier ist eine Modifikation der Antwort von Mercurial, die auch die Unterabfrage der Dekodierung verwendet, sodass in beiden Fällen Variablen verwendet werden können.

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
22
Joey Gennari

Hier ist der Code für die Funktionen, die die Arbeit erledigen

-- 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
21
Oleg

Ich habe die Antwort von @ Slai geliebt. Ich musste nur sehr kleine Änderungen an den Einzeilen vornehmen, nach denen ich suchte. Ich dachte, ich würde sagen, was ich damit gemacht habe, falls es anderen helfen würde, auf diese Seite zu stolpern wie ich:

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]
6
Jason W

Nein, es gibt keine native Funktion, diese Methode hat in der Vergangenheit bei mir funktioniert: http://www.motobit.com/help/scptutl/sa306.htm
so hat diese Methode:
http://www.vbforums.com/showthread.php?t=554886

4
ntziolis
DECLARE @source varbinary(max),  
@encoded_base64 varchar(max),  
@decoded varbinary(max) 
SET @source = CONVERT(varbinary(max), 'welcome') 
-- Convert from varbinary to base64 string 
SET @encoded_base64 = CAST(N'' AS xml).value('xs:base64Binary(sql:variable       
("@source"))', 'varchar(max)') 
  -- Convert back from base64 to varbinary 
   SET @decoded = CAST(N'' AS xml).value('xs:base64Binary(sql:variable             
  ("@encoded_base64"))', 'varbinary(max)') 

 SELECT
  CONVERT(varchar(max), @source) AS [Source varchar], 
   @source AS [Source varbinary], 
     @encoded_base64 AS [Encoded base64], 
     @decoded AS [Decoded varbinary], 
     CONVERT(varchar(max), @decoded) AS [Decoded varchar]

Dies ist nützlich für das Kodieren und Dekodieren.

Von Bharat J

1
Bharat J

Ich habe ein Skript erstellt, um einen vorhandenen, in base64 codierten Hash in Dezimalzahl zu konvertieren. Dies kann nützlich sein:

SELECT LOWER(SUBSTRING(CONVERT(NVARCHAR(42), CAST( [COLUMN_NAME] as XML ).value('.','varbinary(max)'), 1), 3, 40)) from TABLE
0
Phate01

Sie können nur verwenden:

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

nach der Kodierung erhalten Sie den Text 'MjE4Nqk5'.

0
jasmintmp