SQL Server:十六进制转换为Base64

6

我有一个SQL Server数据库,其中包含以十六进制形式存储的jpeg图像(0xFFD8...)。是否有一种方法可以执行查询,使结果是以base64而不是十六进制的形式呈现?

我尝试过谷歌搜索,但好像找不到相关的内容 :/


6
可能是 https://dev59.com/sG445IYBdhLWcg3wBVrz 的重复。接受的答案应该符合您的要求。(由于有未结算的悬赏,我无法投票关闭) - Ed Harper
@EdHarper 不是的,那是将字符串转换为base64,问题是将十六进制转换为base64。 - dadde
@dadde - 最小的更改就可以使我链接的答案在二进制数据类型上运行。我坚持认为这是一个重复的问题。 - Ed Harper
@EdHarper 好的,我也看了那个答案,但我认为主要问题在于十六进制转换,而不是base64转换。尽管如此,我仍然很尊重您的评论。 - dadde
2个回答

7

您可以利用sql解析器将十六进制转换为varbinary:

DECLARE @TestBinHex varchar(max), @TestBinary varbinary(max), @Statement nvarchar(max);
SELECT @TestBinHex = '0x012345';
SELECT @Statement = N'SELECT @binaryResult = ' + @TestBinHex;
EXECUTE sp_executesql @Statement, N'@binaryResult varbinary(max) OUTPUT', @binaryResult=@TestBinary OUTPUT;
SELECT @TestBinary

这将使用包含字面量0x012345的动态SQL来执行sp_executesql,T-SQL解析器完全理解。然后,您可以将其结果馈入@EdHarper提到的XML技巧如下所示:
DECLARE @TestBinHex varchar(max), @TestBinary varbinary(max), @Statement nvarchar(max);
SELECT @TestBinHex = '0x012345';
SELECT @Statement = N'SELECT @binaryResult = ' + @TestBinHex;
EXECUTE sp_executesql @Statement, N'@binaryResult varbinary(max) OUTPUT', @binaryResult=@TestBinary OUTPUT;

SELECT
    CAST(N'' AS XML).value(
          'xs:base64Binary(xs:hexBinary(sql:column("bin")))'
        , 'VARCHAR(MAX)'
    )   Base64Encoding
FROM (
    SELECT @TestBinary AS bin
) AS bin_sql_server_temp;

这真的很有帮助 - 省了我很多工作。谢谢。 - Rob P.
@RobP。如果这个解决了你的问题,为什么不将这个回答标记为正确答案呢? - Yahfoufi
@Yahfoufi - 我不是提问者,但你的回答对我帮助很大。 - Rob P.

0

这是一个包含以十六进制存储的图像的表格示例:

create table t (s image,s_base64 varchar(max));
insert t(s)
values(CAST('This is an image column' as image));

这里有一个关于将十六进制图像转换为Base64的示例

 create view v
 as
 select CAST(s as varbinary(max)) as s,s_base64 from t;
 GO
 update v set s_base64= CAST(N'' AS xml).value('xs:base64Binary(sql:column("v.s"))', 'varchar(max)');
 GO

 select * from v;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接