এসকিউএল সার্ভার 2005 টি-এসকিউএল-তে বেস 64 এনকোডিং


124

আমি একটি টি এসকিউএল কোয়েরি লিখতে চাই যেখানে আমি বেস 64 স্ট্রিং হিসাবে একটি স্ট্রিং এনকোড করেছি। আশ্চর্যজনকভাবে, বেস 64 টি এনকোডিং করার জন্য আমি কোনও নেটিভ টি-এসকিউএল ফাংশন খুঁজে পাই না। একটি স্থানীয় ফাংশন বিদ্যমান? যদি তা না হয় তবে টি-এসকিউএলে বেস 64 এনকোডিং করার সর্বোত্তম উপায় কী?


1
আমি প্রশ্ন করব কেন বেস 64 স্ট্রিং হিসাবে ডেটা সংরক্ষণ করা উচিত। HTTP- র উপরে বেস 64৪ ব্যবহার করার একটি ভাল কারণ রয়েছে, যথা এটি ASCII অক্ষর সেট ছাড়া আর কোনও কিছুই সমর্থন করে না এমন সিস্টেমগুলিতে আন্তঃক্ষমতা নিশ্চিত করে (এবং এটি সমস্ত ডেটা পাঠ্য হিসাবে বিবেচনা করে)। আপনি সহজেই বাইট অ্যারেটিকে বেস -৪ 64 এবং এর বিপরীতে রূপান্তর করতে পারেন, তবে কেন দক্ষতার সাথে ডেটা সংরক্ষণ করবেন না? এমনকি আমি লোকেরা nvarchar কলামগুলিতে বেস 64 স্ট্রিংগুলি সঞ্চয় করে দেখেছি, যা 275% ভেরিবিনারি স্পেস নেয়, যার ফলে ডিস্ক, রাম, নেটওয়ার্ক ইত্যাদির অপচয় হয়
দাগ

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
;

আমাকে প্রথম (এনকোডিং) ক্যোয়ারীতে সাবকোয়ারি-উত্পাদিত টেবিলটি ব্যবহার করতে হয়েছিল কারণ মূল যুক্তি ("টেস্টডাটা") এর হেক্স স্ট্রিং উপস্থাপনায় ("5465737444617461") রূপান্তর করার কোনও উপায় আমি খুঁজে পাইনি to xs: এক্সকোয়ারি বিবৃতিতে হেক্সবাইনারি ()।

আমি আশা করি এটা কারো সাহায্যে লাগবে!


7
এনকোডিং করার সময়, xs:base64Binary(sql:column("bin"))( xs:hexBinaryকল ব্যতীত) পাশাপাশি কাজ করে। অসামান্য সাহায্য!
অ্যাম্ফেটামাচাইন

3
ইউনিকোড পাঠ্যের এনকোডিং সমর্থন করার জন্য, আপনার টেস্টডাটার সামনে 'এন' যুক্ত করা উচিত : 'নির্বাচন কাস্ট ( এন ' টেস্টডাটা 'হিসাবে ভারবিনারি (ম্যাক্স)) এএস বিন'
কেজিটিল ক্লাউসেন

ইউনিকোড পাঠ্যের জন্য কাজ করেনি ... নির্বাচন কাস্ট (এন '' এএস এক্সএমএল)। মূল্য ('এক্সস: বেস 64 ব্যাইনারি (এক্সএস: হেক্সবাইনারি (স্কুয়েল: কলাম ("বিন")))', 'ভিচারার (ম্যাক্স)') বেস64 এন্ডোডিং এন্ড থেকে
hsuk

3
@ হসুক ভারচার ইউনিকোডের সাথে তুলনীয় নয়। আপনি যদি পরিবর্তে এনভারচর (সর্বাধিক) ব্যবহার করেন তবে এটি দুর্দান্ত কাজ করে, যেমন:SELECT CAST( CAST(N'' AS XML).value( 'xs:base64Binary("LgkoCU0JJAlNCTAJQAkyCUcJIAAJCTIJTQkfCU0JLwk+CQ8JIAA4CT4JJAkgABsJKAlNCWQJ")' , 'VARBINARY(MAX)' ) AS NVARCHAR(MAX) ) UnicodeEncoding ;
সর্বদা

7
কারণ কখনও কখনও লোকেরা সফ্টওয়্যারটিতে কিছু নির্দিষ্ট জিনিস সাধারন করে যে কারণে আপনি সবসময় অনুমান করতে পারবেন না ...?
মার্চিয়াল

87

এসকিউএল সার্ভার ২০১২ এবং তারপরের জন্য আমি যে সহজ এবং সংক্ষিপ্ততম সন্ধান করতে পারি তা হ'ল BINARY BASE64:

SELECT CAST('string' as varbinary(max)) FOR XML PATH(''), BINARY BASE64

বেস 64 স্ট্রিংয়ের জন্য

SELECT CAST( CAST( 'c3RyaW5n' as XML ).value('.','varbinary(max)') AS varchar(max) )

(অথবা nvarchar(max)ইউনিকোড স্ট্রিংয়ের জন্য)


1
এটি অন্যান্য উত্তরের চেয়ে অনেক সহজ এবং ঠিক একইভাবে কাজ করে
sxe

2
প্রথম লাইনে বিনারি বেস 64 এর উদ্দেশ্য কী? এটা কি দরকার? আমি ছাড়া চেষ্টা করেছিলাম এবং এটি একই ফলাফল বলে মনে হচ্ছে।
ম্যাটটিএম

1
প্রথম স্নিপেটটি আমার প্রত্যাশার চেয়ে আলাদা ফলাফল দিয়েছে; আমি "ভের্বাইনারি" পরিবর্তন করে "ভের্বাইনারি (সর্বাধিক)" এবং অনুপস্থিত অক্ষরগুলি জায়গায় পড়ে গেল
হেরেফন

3
এটি উত্তর হওয়া উচিত কারণ প্রকৃত উত্তরের জন্য স্ট্রিং আক্ষরিক প্রয়োজন এবং এই উত্তরটি যেমন চলকগুলি গ্রহণ করতে পারে না।
ম্যাথু

2
বেস 64 এর স্ট্রিংয়ের জন্য, আমি .value ('ডেটা [1]', 'ভেরিবিনারি (সর্বাধিক)') ভাইস। ভ্যালু ('।', 'ভেরিবিনারি (সর্বাধিক)') দিয়ে একটি উল্লেখযোগ্য পারফ লাভ দেখছি।
গিয়ারি এম ম্যাকাইভার

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

এখানে চিত্র বর্ণনা লিখুন


সাধারণত দরকারী। এটি পার্সিয়ান এবং রাশিয়ান বা ইমোজি জাতীয় কোনও অক্ষর পরিচালনা করে নি। উদাহরণস্বরূপ, سلام جیران বা В России বেস64 кодирует вас বা ❤️💥🤪🦌🎅⛄🎄🤐🙈🙉🙊💩
হান্টার-অরিওননোয়ার

তুমি ঠিক বলছো. এটি ভারচারকে এনভারচর প্রতিস্থাপনের পরে পরিচালনা করে
ওলেগ

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), এবং তারপর এটা কাজ করে।
লি গ্রিসম

সংক্ষিপ্ততম সমাধান, এসকিউএল সার্ভার 2005+ সামঞ্জস্যপূর্ণ।
YB

4

না, কোনও নেটিভ ফাংশন নেই, অতীতে এই পদ্ধতিটি আমার পক্ষে কাজ করেছে: http://www.motobit.com/help/scptutl/sa306.htm
তাই এই পদ্ধতিটিও রয়েছে:
http://www.vbforums.com/ showthread.php? T = 554886


3
দ্বিতীয় লিঙ্কের নিবন্ধটি খুব কার্যকর ছিল। ধন্যবাদ!
জ্যাকব

1
হ্যাঁ, দ্বিতীয় লিঙ্কটি বেশ কার্যকর
20

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' পাঠ্য পাবেন

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.