Sql server 2005 SQL Server 2005 T-SQL中的Base64编码
我想编写一个T-SQL查询,将字符串编码为Base64字符串。令人惊讶的是,我找不到任何用于Base64编码的本机t-SQL函数。是否存在本机函数?如果没有,在T-SQL中进行Base64编码的最佳方法是什么?没有,没有本机函数,这种方法过去对我很有效:Sql server 2005 SQL Server 2005 T-SQL中的Base64编码,sql-server-2005,tsql,encoding,base64,Sql Server 2005,Tsql,Encoding,Base64,我想编写一个T-SQL查询,将字符串编码为Base64字符串。令人惊讶的是,我找不到任何用于Base64编码的本机t-SQL函数。是否存在本机函数?如果没有,在T-SQL中进行Base64编码的最佳方法是什么?没有,没有本机函数,这种方法过去对我很有效: 这个方法也是如此: 我知道这已经得到了回答,但我只是花了比我愿意承认的更多的时间来实现这一点,所以我将在这里分享它们,以防其他人也需要这样做: -- Encode the string "TestData" in Base64 to get
这个方法也是如此:
我知道这已经得到了回答,但我只是花了比我愿意承认的更多的时间来实现这一点,所以我将在这里分享它们,以防其他人也需要这样做:
-- Encode the string "TestData" in Base64 to get "VGVzdERhdGE="
SELECT
CAST(N'' AS XML).value(
'xs:base64Binary(xs:hexBinary(sql:column("bin")))'
, 'VARCHAR(MAX)'
) Base64Encoding
FROM (
SELECT CAST('TestData' AS VARBINARY(MAX)) AS bin
) AS bin_sql_server_temp;
-- Decode the Base64-encoded string "VGVzdERhdGE=" to get back "TestData"
SELECT
CAST(
CAST(N'' AS XML).value(
'xs:base64Binary("VGVzdERhdGE=")'
, 'VARBINARY(MAX)'
)
AS VARCHAR(MAX)
) ASCIIEncoding
;
在第一个(编码)查询中,我必须使用子查询生成的表,因为我找不到任何方法将原始值(“TestData”)转换为十六进制字符串表示形式(“5465737444617461”),以便在XQuery语句中包含xs:hexBinary()的参数
我希望这对别人有帮助 这里是对mercurial答案的一个修改,它在解码时也使用子查询,允许在两个实例中使用变量
DECLARE
@EncodeIn VARCHAR(100) = 'Test String In',
@EncodeOut VARCHAR(500),
@DecodeOut VARCHAR(200)
SELECT @EncodeOut =
CAST(N'' AS XML).value(
'xs:base64Binary(xs:hexBinary(sql:column("bin")))'
, 'VARCHAR(MAX)'
)
FROM (
SELECT CAST(@EncodeIn AS VARBINARY(MAX)) AS bin
) AS bin_sql_server_temp;
PRINT @EncodeOut
SELECT @DecodeOut =
CAST(
CAST(N'' AS XML).value(
'xs:base64Binary(sql:column("bin"))'
, 'VARBINARY(MAX)'
)
AS VARCHAR(MAX)
)
FROM (
SELECT CAST(@EncodeOut AS VARCHAR(MAX)) AS bin
) AS bin_sql_server_temp;
PRINT @DecodeOut
这对于编码和解码非常有用
借
Bharat J以下是将执行此工作的函数的代码
-- To Base64 string
CREATE FUNCTION [dbo].[fn_str_TO_BASE64]
(
@STRING NVARCHAR(MAX)
)
RETURNS NVARCHAR(MAX)
AS
BEGIN
RETURN (
SELECT
CAST(N'' AS XML).value(
'xs:base64Binary(xs:hexBinary(sql:column("bin")))'
, 'NVARCHAR(MAX)'
) Base64Encoding
FROM (
SELECT CAST(@STRING AS VARBINARY(MAX)) AS bin
) AS bin_sql_server_temp
)
END
GO
-- From Base64 string
CREATE FUNCTION [dbo].[fn_str_FROM_BASE64]
(
@BASE64_STRING NVARCHAR(MAX)
)
RETURNS NVARCHAR(MAX)
AS
BEGIN
RETURN (
SELECT
CAST(
CAST(N'' AS XML).value('xs:base64Binary(sql:variable("@BASE64_STRING"))', 'VARBINARY(MAX)')
AS NVARCHAR(MAX)
) UTF8Encoding
)
END
用法示例:
DECLARE @CHAR NVARCHAR(256) = N'e.g., سلام جیران or В России'
SELECT [dbo].[fn_str_FROM_BASE64]([dbo].[fn_str_TO_BASE64](@CHAR)) as converted
对于SQL Server 2012及更高版本,我能找到的最简单、最短的方法是: 将Base64转换为字符串
SELECT CAST( CAST( 'c3RyaW5n' as XML ).value('.','varbinary(max)') AS varchar(max) )
(或
nvarchar(max)
用于Unicode字符串)我喜欢@Slai的答案。我只需要对我正在寻找的一行程序进行非常小的修改。我想我会分享我的结局,以防其他人像我一样跌跌撞撞地进入这一页:
DECLARE @Source VARCHAR(50) = '12345'
DECLARE @Encoded VARCHAR(500) = CONVERT(VARCHAR(500), (SELECT CONVERT(VARBINARY, @Source) FOR XML PATH(''), BINARY BASE64))
DECLARE @Decoded VARCHAR(500) = CONVERT(VARCHAR(500), CONVERT(XML, @Encoded).value('.','varbinary(max)'))
SELECT @Source AS [Source], @Encoded AS [Encoded], @Decoded AS [Decoded]
我编写了一个脚本,将base64中编码的现有哈希转换为十进制,它可能很有用:
SELECT LOWER(SUBSTRING(CONVERT(NVARCHAR(42), CAST( [COLUMN_NAME] as XML ).value('.','varbinary(max)'), 1), 3, 40)) from TABLE
您可以只使用:
Declare @pass2 binary(32)
Set @pass2 =0x4D006A00450034004E0071006B00350000000000000000000000000000000000
SELECT CONVERT(NVARCHAR(16), @pass2)
编码后,您将收到文本“MjE4Nqk5”从上述所有答案中提取内容,以下是我的想法 基本上有两种方法可以做到这一点:
;WITH TMP AS (
SELECT CAST(N'' AS XML).value('xs:base64Binary(xs:hexBinary(sql:column("bin")))', 'VARCHAR(MAX)') as Base64Encoding
FROM
(
SELECT TOP 10000 CAST(Words AS VARBINARY(MAX)) AS bin FROM TestData
) SRC
)
SELECT *, CAST(CAST(N'' AS XML).value('xs:base64Binary(sql:column("Base64Encoding"))', 'VARBINARY(MAX)') AS NVARCHAR(MAX)) as ASCIIEncoding
FROM
(
SELECT * FROM TMP
) SRC
第二条路呢
;WITH TMP AS
(
SELECT TOP 10000 CONVERT(VARCHAR(MAX), (SELECT CAST(Wordsas varbinary(max)) FOR XML PATH(''))) as BX
FROM TestData
)
SELECT *, CONVERT(NVARCHAR(MAX), CONVERT(XML, BX).value('.','varbinary(max)'))
FROM TMP
在比较性能时,第一个模型的子树成本为2.4414,第二个模型的子树成本为4.1538。这意味着第一个链接的速度大约是第二个的两倍(这是预期的,因为它使用XML,这是出了名的慢)。第二个链接中的文章非常方便。非常感谢。是的,第二个链接非常有用,我知道它很旧,但是你能介绍一下本文中文章/方法的要点吗?编码时,
xs:base64Binary(sql:column(“bin”)
(没有xs:hexBinary
调用)也可以工作。帮了大忙!为了支持unicode文本的编码,您应该在TestData前面添加'N':'SELECT CAST(N'TestData'作为VARBINARY(MAX))作为bin'不适用于unicode文本。。。选择强制转换(N''为XML).value('xs:base64Binary(xs:hexBinary(sql:column(“bin”))),'VARCHAR(MAX'))Base64Encoding FROM(选择强制转换(N'मन्त्रीले उल्ट्याए सात छन्।' 作为VARBINARY(MAX))作为bin)作为bin\u sql\u server\u temp@hsuk varchar与Unicode不兼容。如果改用nvarchar(max),它可以正常工作,例如:SELECT CAST(CAST(N''为XML)。value('xs:base64Binary(“lgkocu0jjalnctajtqkfcu0jlwk+cq8jiaa4ct4c4jjakgabsjkalncwqj”),'VARBINARY(max')作为nvarchar(max)Unideencoding代码>因为有时人们需要在软件中完成某些事情,原因是您无法始终预测?我想知道为什么数据应该存储为base64字符串。在http上使用base64有一个很好的理由,即它确保了只支持ASCII字符集(并且将所有数据都视为文本)的系统之间的互操作性。您可以轻松地将字节数组转换为base-64,反之亦然,那么为什么不高效地存储数据呢?我甚至见过人们在nvarchar列中存储base64字符串,这占用了varbinary 275%的空间,导致了磁盘、ram、网络等的浪费。这是关于生成base64字符串,而不是存储一个。这比其他答案简单得多,而且效果也一样。第一行中二进制base64的用途是什么?需要吗?我尝试不使用,但它似乎给出了相同的结果;我将“varbinary”更改为“varbinary(max)”,缺少的字符也放在适当的位置。这应该是答案,因为实际答案需要字符串文本,并且不能接受类似于此答案的变量。对于base64 to string,我注意到.value('data[1],'varbinary(max)')与.value('..,'varbinary(max)')的性能显著提高。对我来说,我需要将第二行VARBINARY
更改为VARBINARY(56)
,然后它就工作了。最短解决方案,与SQL Server 2005+兼容。非常好。我在生成随机测试数据时使用了这个。我使用它将无法打印的字符从crypt\u gen\u random(N)
转换为更可读的内容:selectconvert(VARCHAR(MAX),(selectcrypt\u gen\u random(20)表示XML路径(“”),BINARY BASE64))
。通常很有用。这没有处理任何字符,如波斯语和俄语,或表情符号。e、 g、B、B、B、B、B、B、B、B、B、B、B、B、B、B、B、B、B、B、B、B、B、B、B、B、B、B、B、B、B、B、B、B、B、B、B❤️你说得对。它在将varchar替换为nvarchar后进行处理
;WITH TMP AS (
SELECT CAST(N'' AS XML).value('xs:base64Binary(xs:hexBinary(sql:column("bin")))', 'VARCHAR(MAX)') as Base64Encoding
FROM
(
SELECT TOP 10000 CAST(Words AS VARBINARY(MAX)) AS bin FROM TestData
) SRC
)
SELECT *, CAST(CAST(N'' AS XML).value('xs:base64Binary(sql:column("Base64Encoding"))', 'VARBINARY(MAX)') AS NVARCHAR(MAX)) as ASCIIEncoding
FROM
(
SELECT * FROM TMP
) SRC
;WITH TMP AS
(
SELECT TOP 10000 CONVERT(VARCHAR(MAX), (SELECT CAST(Wordsas varbinary(max)) FOR XML PATH(''))) as BX
FROM TestData
)
SELECT *, CONVERT(NVARCHAR(MAX), CONVERT(XML, BX).value('.','varbinary(max)'))
FROM TMP