--=================================================
--
-- 巧用 XML 實現 BASE64 編碼和解碼
--
-- 原理: 利用 XML / BINARY BASE64 的儲存特性
--
-- 字元集: 本機字元集使用 varchar
-- UCS2: 使用 nvarchar
-- UTF-8: 自訂 UTF-8/UCS2 之間位元組流互轉的函數
--
-- SQLCenter
-- 2010-09-14
--
--=================================================
------------------- BASE64 編碼 -------------------
declare @str varchar(max), @x xml
set @str = '編碼-SQLCenter'
-- 1. FOR XML ROW
set @x = (select convert(varbinary(max), @str) as b for xml raw, BINARY BASE64) -- 這裡大寫醒目一點
select [str] = @str, [xml] = @x, encode = @x.value('(row/@b)[1]', 'varchar(max)')
/*
str xml encode
--------------- --------------------------------- ---------------------
編碼-SQLCenter <row b="seDC6y1TUUxDZW50ZXI=" /> seDC6y1TUUxDZW50ZXI=
*/
-- 2. FOR XML PATH
set @x = (select b from (select convert(varbinary(max), @str) as b) t for xml path(''))
select [str] = @str, [xml] = @x, encode = @x.value('(b)[1]', 'varchar(max)')
/*
str xml encode
--------------- ---------------------------- ---------------------
編碼-SQLCenter <b>seDC6y1TUUxDZW50ZXI=</b> seDC6y1TUUxDZW50ZXI=
*/
go
------------------- BASE64 解碼 -------------------
declare @base64 varchar(max), @x xml
set @base64 = 'veLC6y1TUUxDZW50ZXI='
set @x = '<b>' + @base64 + '</b>'
select [base64] = @base64, [xml] = @x, decode = convert(varchar(max), @x.value('(b)[1]', 'varbinary(max)'))
/*
base64 xml decode
--------------------- ---------------------------- ---------------
veLC6y1TUUxDZW50ZXI= <b>veLC6y1TUUxDZW50ZXI=</b> 解碼-SQLCenter
*/
go