[英]Converting from base64 string to varbinary(max) in SQL Server
[英]How to convert varbinary(max) to base64 SQL Server 2014
我在 SQL Server 2014 中保存为varbinary(max)
的图像:
0xFFD8FFE115064578696600004D4D002A0000000800070............
我想将其转换为 Base64 以在 Flutter 中使用它。 我试过了
SELECT CAST('' as varbinary(max)) FOR XML PATH(''), BINARY BASE64
并得到:
MHhGRkQ4RkZFMTE1MDY0NTc4Njk2NjAwMDA0RDREMDAyQTAwMDAwMDA4MDAwN..........
但根据这个网站,我应该得到:
/9j/4RUGRXhpZgAATU0AKgAAAAgABwESAAMAAAABAAEAAAEaAAUAAAABAAAAYgEbAA........
那么如何将varbinary(max)
转换为 base64?
你为什么要CAST()
varbinary 数据? 您只需要将 select 它作为 varbinary 值的元素或属性来获取 base64 编码...
/*
* Data setup...
*/
if object_id('tempdb..#demo') is not null
drop table #demo;
create table #demo (
fancyImage varbinary(max)
);
insert #demo (fancyImage) values (0xFFD8FFE115064578696600004D4D002A000000080007);
/*
* Select as an element containing base64 data
*/
select fancyImage as [base64DemoElement]
from #demo
for xml path(''), binary base64;
/*
* Select as an attribute containing base64 data
*/
select fancyImage as [@base64Attribute]
from #demo
for xml path('demoElement'), binary base64;
第一个 select 在元素中输出基本数据:
<base64DemoElement>/9j/4RUGRXhpZgAATU0AKgAAAAgABw==</base64DemoElement>
第二个 select 在一个属性中输出 base64 数据:
<demoElement base64Attribute="/9j/4RUGRXhpZgAATU0AKgAAAAgABw==" />
在与@DaleK 讨论评论之后,第三种选择返回没有任何 XML 标签的裸 base64 字符:
select (
select top 1 cast(fancyImage as varbinary(max)) as [base64DemoElement]
from #demo
for xml path(''), type, binary base64
).value('.', 'varchar(max)') as [Base64 characters];
哪个输出:
Base64 字符 |
---|
/9j/4RUGRXhpZgAATU0AKgAAAAgABw== |
To select a bare Bas64 value in SQL Server, without any XML node, you just need an unnamed column in FOR XML
SELECT CAST(fancyImage AS varbinary(max))
FROM #demo
FOR XML PATH(''), BINARY BASE64;
或作为相关子查询
SELECT
myBase64 = (
SELECT CAST(fancyImage AS varbinary(max))
FOR XML PATH(''), BINARY BASE64
)
FROM #demo;
我认为它是 SQL-Server 的 v2008,当 base64 在 XML 中被设为二进制文件的默认值时(之前它是一个十六进制字符串)。 无需明确指定。
(选项BINARY BASE64
需要模式AUTO
...)
只是为了演示来回,我声明了一些文本(字符链)并将其转换为二进制(相同的字节链,但不再是字符串):
DECLARE @someText VARCHAR(100) = 'This is just some text...';
DECLARE @binary VARBINARY(MAX) = CAST(@someText AS VARBINARY(MAX));
--在这种情况下,可以依赖隐式转换:简单的方法
DECLARE @base64_easy VARCHAR(100) = (SELECT @binary FOR XML PATH(''));
--为了证明我们发现的 base64 ( binary
VGhpcyBpcyBqdXN0IHNvbWUgdGV4dC4uLg==
) 是正确的,我们只需将其转换为XML
并使用.value()
DECLARE @reConverted VARBINARY(MAX) = (SELECT CAST(@base64_easy AS XML).value('.','varbinary(max)'));
-- 再次将此字节链转换为varchar
将显示其(未更改的)内容:
SELECT CAST(@reConverted AS VARCHAR(100));
所有这些都可以在临时查询中使用。
暗示:
更明确的语句SELECT
将值转换为 XML 并通过.value()
将其读入文本
(需要,type
以允许 XML 方法)
DECLARE @base64 VARCHAR(100) = (SELECT @binary FOR XML PATH(''), type).value('.','nvarchar(max)'); --VGhpcyBpcyBqdXN0IHNvbWUgdGV4dC4uLg==
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.