繁体   English   中英

如何将 varbinary(max) 转换为 base64 SQL Server 2014

[英]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;

db<>小提琴

我认为它是 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM