SQL सर्वर 2005 T-SQL में Base64 एन्कोडिंग


124

मैं एक टी-एसक्यूएल क्वेरी लिखना चाहता हूं जहां मैं एक स्ट्रिंग को बेस 64 स्ट्रिंग के रूप में एन्कोड करता हूं। हैरानी की बात है, मैं Base64 एन्कोडिंग करने के लिए कोई मूल T-SQL फ़ंक्शन नहीं ढूँढ सकता। क्या एक मूल कार्य मौजूद है? यदि नहीं, तो टी-एसक्यूएल में बेस 64 एनकोडिंग करने का सबसे अच्छा तरीका क्या है?


1
मेरा प्रश्न है कि डेटा को बेस 64 स्ट्रिंग के रूप में क्यों संग्रहीत किया जाना चाहिए। Http पर base64 का उपयोग करने का एक अच्छा कारण है, अर्थात् यह सिस्टम में अंतर को सुनिश्चित करता है जो ASCII वर्ण सेट (और पाठ के रूप में सभी डेटा का इलाज) से अधिक कुछ भी समर्थन नहीं करता है। आप आसानी से एक बाइट सरणी को बेस -64 में बदल सकते हैं और इसके विपरीत, इसलिए डेटा को कुशलता से संग्रहीत नहीं करें? मैं भी देखा है लोगों को, nvarchar स्तंभ है, जो 275% varbinary की जगह लेता में बेस 64-तार की दुकान डिस्क, राम, नेटवर्क, आदि की बर्बाद करने के लिए अग्रणी
डेग

9
यह एक बेस 64 स्ट्रिंग उत्पन्न करने के बारे में है, एक भंडारण नहीं।
याकूब

जवाबों:


187

मुझे पता है कि यह पहले ही जवाब दे दिया गया है, लेकिन मैंने इसे पूरा करने के लिए सिंगल-लाइन एसक्यूएल स्टेटमेंट के साथ आने की परवाह करने से ज्यादा समय बिताया है, इसलिए मैं उन्हें यहां साझा करूंगा यदि किसी और को भी ऐसा करने की आवश्यकता है:

-- 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: XQuery स्टेटमेंट में हेक्सबिनरी ()।

मुझे उम्मीद है इससे किसी को सहायता मिलेगी!


7
जब एन्कोडिंग xs:base64Binary(sql:column("bin"))(बिना xs:hexBinaryकॉल के) भी काम करता है। बड़ी मदद!
एम्फ़ैटेमाचिन

3
यूनिकोड पाठ के एन्कोडिंग का समर्थन करने के लिए, आपको TestData के सामने 'N' जोड़ना चाहिए : 'SELECT CAST ( N ' TestData 'AS VARBINARY (MAX)) AS बिन'
Kjetil Klaussen

यूनिकोड टेक्स्ट के लिए काम नहीं किया ... सेलेक्ट कास्ट (N '' as XML) .value ('xs: base64Binary (xs: hexBinary (sql: column ("bin"))),' VCHCHAR (MAX))) Base64Encoding FROM (Select CAST (N 'मन्त्रीले उल्ट्याए सात छन्।) AS VARBINARY (MAX)) AS bin) AS bin_sql_server_temp;
hsuk

3
@hsuk varchar यूनिकोड के साथ अनुकूल नहीं है। यदि आप इसके बजाय nvarchar (अधिकतम) का उपयोग करते हैं तो यह ठीक काम करता है, जैसे:SELECT CAST( CAST(N'' AS XML).value( 'xs:base64Binary("LgkoCU0JJAlNCTAJQAkyCUcJIAAJCTIJTQkfCU0JLwk+CQ8JIAA4CT4JJAkgABsJKAlNCWQJ")' , 'VARBINARY(MAX)' ) AS NVARCHAR(MAX) ) UnicodeEncoding ;
AlwaysLearning

7
क्योंकि कभी-कभी लोगों को सॉफ़्टवेयर में कुछ चीजों को पूरा करने की आवश्यकता होती है, जिन कारणों से आप हमेशा भविष्यवाणी नहीं कर सकते हैं ...?
मर्क्यूरियल

87

एसक्यूएल सर्वर 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)यूनिकोड के तार के लिए)


1
यह अन्य उत्तरों की तुलना में बहुत सरल है, और साथ ही काम करता है
sXe

2
पहली पंक्ति में BINARY BASE64 का उद्देश्य क्या है? क्या इसकी जरूरत है? मैंने बिना कोशिश की और यह वही परिणाम देता है।
मटुक

1
पहले स्निपेट ने मुझे उम्मीद से अलग परिणाम दिया; मैंने "वर्बिनरी" को "
वर्बिनरी

3
यह उत्तर होना चाहिए क्योंकि वास्तविक उत्तर के लिए स्ट्रिंग शाब्दिकों की आवश्यकता होती है और इस उत्तर की तरह चर स्वीकार नहीं कर सकते।
मैथ्यू

2
Base64 स्ट्रिंग के लिए, मैं .value ('डेटा [1]', 'varbinary (अधिकतम)') वाइस .value ('', 'varbinary (मैक्स)') के साथ एक महत्वपूर्ण पूर्ण लाभ प्राप्त कर रहा हूँ।
गेरी एम। मैकीवर

25

यहां मर्क्यूरियल के जवाब में संशोधन किया गया है जो डिकोड पर सबक्विरी का उपयोग करता है, साथ ही दोनों उदाहरणों में चर का उपयोग करने की अनुमति देता है।

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

22

यहां उन कार्यों के लिए कोड है जो कार्य करेंगे

-- 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

यहाँ छवि विवरण दर्ज करें


आम तौर पर उपयोगी है। यह फारसी और रूसी, या इमोजी जैसे किसी भी चरित्र को संभाल नहीं पाया। उदाहरण के लिए, سلام جیران या В России Base64 кодирует вас या no
हंटर-ओरियनोिर

आप सही हे। यह वॉकर को नवरचेर की जगह लेने के बाद संभालती है
ओलेग

8

मुझे @ स्लाई का जवाब बहुत अच्छा लगा। मुझे केवल उसी एक लाइनर में बहुत मामूली संशोधन करना था जिसकी मुझे तलाश थी। मुझे लगा कि मैं इस मामले में किसी और के साथ साझा करने में मदद करता हूं जो मैंने इस पृष्ठ पर ठोकर खाई है जैसे मैंने किया था:

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), और फिर इसने काम किया।
ली ग्रिसोम

सबसे छोटा समाधान, SQL सर्वर 2005+ संगत।
YB

4

नहीं, कोई मूल कार्य नहीं है, इस पद्धति ने मेरे लिए अतीत में काम किया है: http://www.motobit.com/help/scptutl/sa306.htm
तो इस विधि में है:
http://www.vbforums.com/ showthread.php? टी = 554,886


3
दूसरी कड़ी में लेख बहुत उपयोगी था। धन्यवाद!
याकूब

1
हाँ, दूसरा लिंक बहुत उपयोगी है
खुलता है

1
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]

यह सांकेतिक शब्दों में बदलना और डिकोड के लिए उपयोगी है।

भरत जे द्वारा


0

मैंने एक मौजूदा हैश को बेस 64 में दशमलव में परिवर्तित करने के लिए एक स्क्रिप्ट किया, यह उपयोगी हो सकता है:

SELECT LOWER(SUBSTRING(CONVERT(NVARCHAR(42), CAST( [COLUMN_NAME] as XML ).value('.','varbinary(max)'), 1), 3, 40)) from TABLE

-1

आप बस का उपयोग कर सकते हैं:

Declare @pass2 binary(32)
Set @pass2 =0x4D006A00450034004E0071006B00350000000000000000000000000000000000
SELECT CONVERT(NVARCHAR(16), @pass2)

फिर एन्कोडिंग के बाद आपको 'MjE4Nqk5' टेक्स्ट प्राप्त होगा

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.