Кодировка Base64 в SQL Server 2005 T-SQL - PullRequest
111 голосов
/ 22 февраля 2011

Я хотел бы написать запрос T-SQL, в котором я кодирую строку как строку Base64.Удивительно, но я не могу найти никаких встроенных функций T-SQL для кодирования Base64.Существует ли встроенная функция?Если нет, каков наилучший способ кодирования Base64 в T-SQL?

Ответы [ 8 ]

176 голосов
/ 23 ноября 2011

Я знаю, что на этот вопрос уже дан ответ, но я просто потратил больше времени, чем хотел бы, чтобы придумать однострочные операторы 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
;

Мне пришлось использовать сгенерированную подзапросом таблицу в первом (кодирующем) запросе, потому что я не смог найти способ преобразовать исходное значение ("TestData") в его шестнадцатеричное строковое представление ("5465737444617461") для включения в качестве аргумент для xs: hexBinary () в операторе XQuery.

Надеюсь, это кому-нибудь поможет!

71 голосов
/ 26 августа 2015

Самый простой и короткий путь, который я мог найти для SQL Server 2012 и выше, это BINARY BASE64:

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

Для Base64 в строку

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

(или nvarchar(max) для строк Unicode)

22 голосов
/ 06 июля 2012

Вот модификация ответа 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
21 голосов
/ 08 мая 2014

Вот код для функций, которые будут выполнять работу

-- 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
7 голосов
/ 22 февраля 2016

Мне понравился ответ @ 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]
4 голосов
/ 22 февраля 2011

Нет, нет встроенной функции, этот метод работал для меня в прошлом: http://www.motobit.com/help/scptutl/sa306.htm
как и этот метод:
http://www.vbforums.com/showthread.php?t=554886

1 голос
/ 11 апреля 2013
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]

Это полезно для кодирования и декодирования.

По Бхарат Дж

0 голосов
/ 03 января 2018

Я сделал скрипт для преобразования существующего хеша, закодированного в base64, в десятичный, это может быть полезно:

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