Хочу поделиться способом преобразования строки в Base64 и обратно. Сразу оговорюсь, что способ не самый быстрый, но главное его преимущество в том, что он работает прямо «из коробки» без применения специальных CLR функций. Нам потребуется тестовая база данных и таблица для примера:
use [master];
go
if db_id('Base64_test') is not null
begin
alter database [Base64_test] set single_user with rollback immediate;
drop database [Base64_test];
end
go
create database [Base64_test];
go
use [Base64_test];
create table [dbo].[Base64_test] (
[plain_text] nvarchar(max),
[base64_text] nvarchar(max)
);
go
insert into [dbo].[Base64_test] ([plain_text], [base64_text])
values (N'My Test String', N'TQB5ACAAVABlAHMAdAAgAFMAdAByAGkAbgBnAA==');
go
Пример конвертации строки в Base64:
-- Конвертируем значение переменной
declare @value varbinary(max);
set @value = cast(N'My Test String' as varbinary(max));
select cast(N'' as xml).value('xs:base64Binary(sql:variable("@value"))', 'varchar(max)') as [encoded_value];
go
-- Конвертируем значение столбца в таблице
select cast(N'' as xml).value('xs:base64Binary(sql:column("plain_text"))', 'varchar(max)') as [encoded_value]
from (
select cast([plain_text] as varbinary(max)) as [plain_text]
from [dbo].[Base64_test]
) as tmp;
go
Пример обратного преобразования:
-- Конвертируем значение
select cast(cast(N'' as xml).value('xs:base64Binary("TQB5ACAAVABlAHMAdAAgAFMAdAByAGkAbgBnAA==")', 'varbinary(max)') as nvarchar(max)) as [decoded_value];
go
-- Конвертируем значение переменной
declare @value varchar(max)
set @value = 'TQB5ACAAVABlAHMAdAAgAFMAdAByAGkAbgBnAA=='
select cast(cast(N'' as xml).value('xs:base64Binary(sql:variable("@value"))', 'varbinary(max)') as nvarchar(max)) as [decoded_value];
go
-- Конвертируем значение столбца в таблице
select cast(cast(N'' as xml).value('xs:base64Binary(sql:column("base64_text"))', 'varbinary(max)') as nvarchar(max)) as [decoded_value]
from [dbo].[Base64_test];
go
Спасибо, полезная информация.
Есть пример как в оракле сделать то же самое?
Увы, с Oracle не работаю.
Начиная с 2012 появилась опция for xml …, BINARY BASE64
Т.е. вот такие конструкции – [почти] эквивалентны:
Select Cast(N’plain_text’ as varbinary(max))
for xml path(”), BINARY BASE64
— Конвертируем значение переменной
declare @value varbinary(max);
set @value = cast(N’plain_text’ as varbinary(max));
select cast(N” as xml).value(‘xs:base64Binary(sql:variable(“@value”))’, ‘varchar(max)’) as [encoded_value];