Я хотів би написати запит T-SQL, де я кодую рядок як рядок Base64. Дивно, але я не можу знайти жодних власних функцій T-SQL для кодування Base64. Чи існує нативна функція? Якщо ні, то який найкращий спосіб зробити кодування Base64 у T-SQL?
Я хотів би написати запит T-SQL, де я кодую рядок як рядок Base64. Дивно, але я не можу знайти жодних власних функцій T-SQL для кодування Base64. Чи існує нативна функція? Якщо ні, то який найкращий спосіб зробити кодування Base64 у T-SQL?
Відповіді:
Я знаю, що на це вже отримано відповідь, але я просто витратив більше часу, ніж я дбаю, щоб визнати, що я вийшов з однорядними операторами SQL, щоб досягти цього, тому я поділюсь ними тут, якщо хтось інший повинен зробити те саме:
-- 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"), щоб включити його як аргумент xs: hexBinary () у операторі XQuery.
Я сподіваюся, що це комусь допоможе!
xs:base64Binary(sql:column("bin"))
(без xs:hexBinary
виклику). Чудова допомога!
SELECT CAST( CAST(N'' AS XML).value( 'xs:base64Binary("LgkoCU0JJAlNCTAJQAkyCUcJIAAJCTIJTQkfCU0JLwk+CQ8JIAA4CT4JJAkgABsJKAlNCWQJ")' , 'VARBINARY(MAX)' ) AS NVARCHAR(MAX) ) UnicodeEncoding ;
Найпростіший і найкоротший спосіб, який я міг знайти для SQL Server 2012 і вище BINARY BASE64
:
SELECT CAST('string' as varbinary(max)) FOR XML PATH(''), BINARY BASE64
Для Base64 до рядка
SELECT CAST( CAST( 'c3RyaW5n' as XML ).value('.','varbinary(max)') AS varchar(max) )
(або nvarchar(max)
для рядків Unicode)
Ось модифікація відповіді 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
Ось код для функцій, які будуть виконувати роботу
-- 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
Мені сподобалась відповідь @ 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]
VARBINARY
на VARBINARY(56)
, і тоді воно спрацювало.
Ні, немає рідної функції, цей метод працював для мене в минулому:
http://www.motobit.com/help/scptutl/sa306.htm,
таким чином, є цей метод:
http://www.vbforums.com/ showthread.php? t = 554886
DECLARE @source varbinary(max),
@encoded_base64 varchar(max),
@decoded varbinary(max)
SET @source = CONVERT(varbinary(max), 'welcome')
-- Convert from varbinary to base64 string
SET @encoded_base64 = CAST(N'' AS xml).value('xs:base64Binary(sql:variable
("@source"))', 'varchar(max)')
-- Convert back from base64 to varbinary
SET @decoded = CAST(N'' AS xml).value('xs:base64Binary(sql:variable
("@encoded_base64"))', 'varbinary(max)')
SELECT
CONVERT(varchar(max), @source) AS [Source varchar],
@source AS [Source varbinary],
@encoded_base64 AS [Encoded base64],
@decoded AS [Decoded varbinary],
CONVERT(varchar(max), @decoded) AS [Decoded varchar]
Це корисно для кодування та декодування.
Автор Бхарат Дж