文字列を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) )
(またはUnicode文字列の場合は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 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
@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
Base64でエンコードされた既存のハッシュを10進数に変換するスクリプトを作成しました。
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」を受け取ります