[sql-server-2005] SQL Server 2005 T-SQL의 Base64 인코딩

문자열을 Base64 문자열로 인코딩하는 T-SQL 쿼리를 작성하고 싶습니다. 놀랍게도 Base64 인코딩을 수행하기위한 네이티브 T-SQL 함수를 찾을 수 없습니다. 네이티브 함수가 있습니까? 그렇지 않은 경우 T-SQL에서 Base64 인코딩을 수행하는 가장 좋은 방법은 무엇입니까?



답변

이 문제에 대한 답변은 이미 알고 있지만,이 작업을 수행하기 위해 한 줄 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”)을 16 진 문자열 표현 ( “5465737444617461”)으로 변환하여 인수로 포함 할 방법을 찾을 수 없었기 때문에 첫 번째 (인코딩) 쿼리에서 하위 쿼리 생성 테이블을 사용해야했습니다. XQuery 문의 xs : hexBinary ()

나는 이것이 누군가를 돕기를 바랍니다!


답변

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)유니 코드 문자열의 경우)


답변

다음은 디코딩에서 하위 쿼리를 사용하는 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


답변

다음은 작업을 수행 할 함수에 대한 코드입니다.

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

여기에 이미지 설명 입력


답변

@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]


답변

아니요, 기본 기능이 없습니다.이 방법은 과거에 저에게 효과적이었습니다.
http://www.motobit.com/help/scptutl/sa306.htm
그래서이 방법도 있습니다 :
http://www.vbforums.com/ showthread.php? t = 554886


답변

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]

인코딩 및 디코딩에 유용합니다.

Bharat J 작성