문자열을 Base64 문자열로 인코딩하는 T-SQL 쿼리를 작성하고 싶습니다. 놀랍게도 Base64 인코딩을 수행하기위한 네이티브 T-SQL 함수를 찾을 수 없습니다. 네이티브 함수가 있습니까? 그렇지 않은 경우 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 ()
나는 이것이 누군가를 돕기를 바랍니다!
xs:base64Binary(sql:column("bin"))
( xs:hexBinary
호출 없이 )도 작동합니다. 큰 도움!
SELECT CAST( CAST(N'' AS XML).value( 'xs:base64Binary("LgkoCU0JJAlNCTAJQAkyCUcJIAAJCTIJTQkfCU0JLwk+CQ8JIAA4CT4JJAkgABsJKAlNCWQJ")' , 'VARBINARY(MAX)' ) AS NVARCHAR(MAX) ) UnicodeEncoding ;
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]
VARBINARY
을 으로 변경 VARBINARY(56)
해야했는데 제대로 작동했습니다.
아니요, 기본 기능이 없습니다.이 방법은 과거에 저에게 효과적이었습니다.
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 작성