ฉันต้องการเขียนแบบสอบถาม 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]
นี่เป็นประโยชน์สำหรับการเข้ารหัสและถอดรหัส
โดย Bharat J
ฉันสร้างสคริปต์เพื่อแปลงแฮชที่มีอยู่ซึ่งเข้ารหัสใน 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'