परिचय
दैनिक कार्य के लिए शायद ही कभी बाइनरी डेटा को सीधे डेटाबेस कॉलम में संग्रहीत करने की आवश्यकता होती है। हालांकि, कुछ मामलों में यह बहुत उपयोगी है।
आम राय के विपरीत, बाइट सरणियाँ बड़ी बाइनरी ऑब्जेक्ट्स (दस्तावेज़, मल्टीमीडिया, आदि) को संग्रहीत करने की तुलना में काफी अधिक मदद कर सकती हैं। साथ ही, उनका उपयोग तेजी से खोज/उच्च-स्तरीय विश्लेषण के लिए हैश मानों और नमूना डेटा को संग्रहीत करने के लिए किया जा सकता है। या, उनमें बाइट हो सकते हैं जो कुछ इलेक्ट्रॉनिक रिले में चालू/बंद स्थिति में हैं। जैसे ही हम डेटाबेस में संग्रहीत हार्डवेयर डेटा के बारे में सोचना शुरू करते हैं, एप्लिकेशन अधिक स्पष्ट हो जाते हैं।
VARCHAR डेटा प्रकारों के विपरीत जहां आपको संयोजन और कोड पृष्ठों का ध्यान रखना होता है, बाइनरी डेटा प्रकार बाइट्स की श्रृंखला होती है (कभी-कभी ऑब्जेक्ट-ओरिएंटेड प्रोग्रामिंग भाषाओं में बाइट एरे कहा जाता है), या तो निश्चित (BINAR) या चर (VARBINAR) आकार में।पी>
बाइनरी प्रकारों के विवरण को बेहतर ढंग से समझने के लिए, हम सबसे पहले हेक्साडेसिमल संख्याओं का संक्षिप्त परिचय देंगे, जो कि इस डेटा को आंतरिक रूप से कैसे संग्रहीत किया जाता है।
हेक्साडेसिमल नंबर
यदि आपने हाई स्कूल में हेक्साडेसिमल संख्याओं पर कक्षा छोड़ दी है, तो एक समर्पित विकिपीडिया पृष्ठ पर एक अच्छा परिचय मिल सकता है। वहां, आप इस नंबरिंग प्रारूप से परिचित हो सकते हैं।
इस लेख को समझने के लिए, यह जानना महत्वपूर्ण है कि SQL सर्वर प्रबंधन स्टूडियो "0x" उपसर्ग के साथ हेक्साडेसिमल प्रारूप में बाइनरी डेटा प्रदर्शित करता है।
हेक्साडेसिमल और दशमलव क्रमांकन प्रारूप में कोई बड़ा अंतर नहीं है। हेक्साडेसिमल प्रारूप दशमलव संकेतन (0-9) के आधार -10 के बजाय आधार -16 संकेतों (0-9 और ए-एफ) का उपयोग करता है। मान A-F दशमलव संख्या संकेतन से 10-15 संख्याएँ हैं।
यही कारण है कि हम हेक्साडेसिमल नोटेशन का उपयोग करते हैं। चूंकि एक बाइट में 8 बिट होते हैं, जिससे 256 असतत पूर्णांक संख्याओं की अनुमति मिलती है, इसलिए बाइट्स को हेक्स प्रारूप में प्रस्तुत करना फायदेमंद होता है। यदि हम सीमा 0-256 को लक्षित कर रहे हैं, तो इसे हेक्साडेसिमल नोटेशन में 00-FF के रूप में दर्शाया जाता है। प्रबंधन स्टूडियो में उपसर्ग पढ़ने की स्पष्टता के लिए है, इस बात पर जोर देने के लिए कि हम हेक्साडेसिमल संख्या दिखा रहे हैं, न कि डिफ़ॉल्ट दशमलव मान।
CAST () का उपयोग करके मैन्युअल मान रूपांतरण
चूंकि बाइनरी मान, उनके सख्त अर्थ में, स्ट्रिंग हैं, हम उन्हें CAST का उपयोग करके संख्या से वर्ण प्रारूप में परिवर्तित कर सकते हैं। या बदलें SQL विधियाँ।
उस उदाहरण पर एक नज़र डालें जो कास्ट . का उपयोग करता है विधि:
SELECT CAST('HexTest' AS VARBINARY);
SELECT CAST(0x48657854657374 AS VARCHAR);
कन्वर्ट के साथ रूपांतरण शैलियों का उपयोग करना ()
कन्वर्ट () विधि, CAST() . के विपरीत , के पास रूपांतरण शैलियों का उपयोग करने का एक अतिरिक्त विकल्प है।
रूपांतरण शैलियाँ रूपांतरण प्रक्रिया में उपयोग किए जाने वाले नियमों के लिए टेम्पलेट हैं। कन्वर्ट () अधिकतर दिनांक/समय संचालन में उपयोग किया जाता है। जब डेटा गैर-मानक प्रारूप में होता है, तो इसका उपयोग बाइनरी मान रूपांतरण में किया जा सकता है। ध्यान दें कि बाइनरी डेटा प्रकार उचित पैरामीटर मानों के बिना स्वचालित डेटा प्रकार रूपांतरण का समर्थन नहीं करते हैं। तब SQL सर्वर एक अपवाद फेंक देगा।
अगर हम CONVERT() . को देखें तो विधि परिभाषा, हम देखते हैं कि यह दो अनिवार्य और एक वैकल्पिक पैरामीटर लेता है।
पहला पैरामीटर लक्ष्य डेटा प्रकार है, और दूसरा वह मान है जिससे हम कनवर्ट करना चाहते हैं। हमारे मामले में तीसरा पैरामीटर 1 . को मान सकता है या 2 . मान 1 इसका मतलब है कि कन्वर्ट () इनपुट स्ट्रिंग को टेक्स्ट प्रारूप में हेक्साडेसिमल स्ट्रिंग के रूप में मानना चाहिए, और मान 2 इसका मतलब है कि आप 0x . को छोड़ना चाहते हैं उपसर्ग।
उस व्यवहार को प्रदर्शित करने वाले उदाहरणों पर एक नज़र डालें:
DECLARE @MyString NVARCHAR(500)='0x48657854657374';
SELECT CONVERT(VARBINARY(MAX), @MyString );
-- String value is directly converted to binary value - we wanted is to change the datatype
-- and not convert "0x.." prefix to the hexadecimal value
SELECT CONVERT(VARBINARY(MAX), @MyString, 1);
बाइनरी और VARBINARY के बीच अंतर
बाइनरी डेटा के साथ, हम दो प्रकार के डेटा प्रकारों का उपयोग कर सकते हैं - निश्चित आकार और चर आकार। या, वे BINARY और VARBINARY हैं।
यदि हम निश्चित-आकार के चर का उपयोग करते हैं, तो सामग्री को हमेशा 0x00 की पैडिंग के साथ उसके परिभाषित आकार तक बढ़ाया जाता है ... - परिवर्तनीय लंबाई में कोई पैडिंग नहीं है। इन चरों पर योग संचालन का उपयोग करना कोई अतिरिक्त क्रियान्वित नहीं है। मान एक दूसरे से जुड़ जाते हैं। स्ट्रिंग प्रकारों के साथ भी ऐसा ही है।
उपसर्ग व्यवहार को प्रदर्शित करने के लिए हम द्विआधारी योग संचालन के साथ दो सरल उदाहरणों का उपयोग करेंगे:
SELECT CAST('T' AS BINARY(1)) + CAST('e' AS BINARY(1)) + CAST('s' AS BINARY(1)) + CAST('t' AS BINARY(1));
SELECT CAST('T' AS BINARY(2)) + CAST('e' AS BINARY(2)) + CAST('s' AS BINARY(2)) + CAST('t' AS BINARY(2));
BINARY(2) स्टेटमेंट में प्रत्येक मान 0x00 . के साथ पोस्टफिक्स्ड है मान।
बाइनरी डेटा प्रकारों के साथ पूर्णांक मानों का उपयोग करना
SQL सर्वर संख्यात्मक प्रकारों और बाइनरी प्रकारों के बीच कनवर्ट करने के लिए अंतर्निहित विधियों के साथ आता है। हमने इसका प्रदर्शन किया जहां हमने परीक्षा . को बदल दिया बाइनरी प्रारूप में स्ट्रिंग, और फिर ASCII () फ़ंक्शन का उपयोग किए बिना, BIGINT प्रारूप में वापस:
SELECT CAST('Test' AS VARBINARY(MAX));
SELECT CAST(CAST('Test' AS VARBINARY(MAX)) AS BIGINT);
चरित्र और हेक्साडेसिमल मानों के बीच सरल रूपांतरण
चार्टर और हेक्साडेसिमल मानों के बीच कनवर्ट करने के लिए, एक कस्टम फ़ंक्शन लिखना उपयोगी होता है जो इस ऑपरेशन को लगातार निष्पादित करेगा। एक संभावित तरीका नीचे दिया गया है:
-- DROP FUNCTION dbo.FN_CH_HEX(@InputValue CHAR(1)
CREATE OR ALTER FUNCTION dbo.FN_CH_HEX(@InputValue CHAR(1))
RETURNS CHAR(2)
AS
BEGIN
RETURN(CONVERT(CHAR(2), CAST(@InputValue AS BINARY(1)), 2));
END;
-- SELECT dbo.FN_CH_HEX('A')
इस बार हमने पैरामीटर मान 2 . का उपयोग किया कन्वर्ट () . में समारोह। यह दर्शाता है कि इस ऑपरेशन को ASCII कोड में मैप नहीं किया जाना चाहिए और 0x… के बिना प्रदर्शित किया जाना चाहिए उपसर्ग।
उदाहरण केस स्टडी:SQL सर्वर बाइनरी प्रकार में फ़ोटो संग्रहीत करना
हम आम तौर पर एक कस्टम विंडोज़/वेब एप्लिकेशन को लागू करके या सी # कोड के साथ एक कस्टम एसएसआईएस पैकेज लिखकर इस समस्या का सामना करते हैं। इस उदाहरण में, मैं केवल SQL भाषा का उपयोग करूँगा। यदि आपके पास डेटाबेस फ्रंट-एंड टूल तक पहुंच नहीं है तो यह अधिक उपयोगी हो सकता है।
डेटाबेस तालिका में चित्रों को संग्रहीत करने के लिए, हमें एक तालिका बनानी होगी जो उन्हें रखेगी। तालिका में चित्र नाम और चित्र बाइनरी सामग्री रखने वाले स्तंभ शामिल होने चाहिए:
-- DROP TABLE T_BINARY_DATA
CREATE TABLE T_BINARY_DATA
(
PICTURE_ID INT IDENTITY(1,1) PRIMARY KEY,
PICTURE_NAME NVARCHAR(100),
PICTURE_FILE_NAME NVARCHAR(500),
PICTURE_DATA VARBINARY(MAX)
)
GO
SQL सर्वर इंस्टेंस में बाइनरी डेटा लोड करने में सक्षम करने के लिए, हमें सर्वर को दो विकल्पों के साथ कॉन्फ़िगर करने की आवश्यकता है:
- OLE ऑटोमेशन प्रक्रिया विकल्प सक्षम करें
- छवि आयात प्रक्रिया को क्रियान्वित करने वाले उपयोगकर्ता को बल्कएडमिन विशेषाधिकार प्रदान करना।
नीचे दी गई स्क्रिप्ट SQL सर्वर इंस्टेंस के उच्च-विशेषाधिकार प्राप्त उपयोगकर्ता के तहत कार्य करेगी:
USE MASTER
GO
EXEC sp_configure 'show advanced options', 1;
GO
RECONFIGURE;
GO
EXEC sp_configure 'Ole Automation Procedures', 1;
GO
RECONFIGURE;
GO
-- Add 'bulkadmin' to the correct user
ALTER SERVER ROLE [bulkadmin] ADD MEMBER [NT AUTHORITY\SYSTEM]
GO
अब हम आयात और निर्यात प्रक्रिया लिखना शुरू कर सकते हैं:
-- DROP PROCEDURE dbo.proc_ImportBinary
-- DROP PROCEDURE dbo.proc_ExportBinary
CREATE PROCEDURE dbo.proc_ImportBinary
(
@PICTURE_NAME NVARCHAR(100)
, @FOLDER_PATH NVARCHAR(500)
, @PICTURE_FILE_NAME NVARCHAR(500)
)
AS
BEGIN
DECLARE @OutputPath NVARCHAR(4000);
DECLARE @TSQLDYN NVARCHAR(4000);
SET @OutputPath = CONCAT(@OutputPath,'\',@PICTURE_FILE_NAME)
SET @TSQLDYN = 'INSERT INTO T_BINARY_DATA(PICTURE_NAME,PICTURE_FILE_NAME,PICTURE_DATA) '
+ 'SELECT ' + '''' + @PICTURE_NAME + '''' + ',' + '''' + @PICTURE_FILE_NAME + '''' + ', * '
+ ' FROM Openrowset( Bulk ' + '''' + @OutputPath + '''' + ', Single_Blob) as img'
EXEC (@TSQLDYN)
END
GO
CREATE PROCEDURE dbo.proc_ExportBinary (
@PICTURE_NAME NVARCHAR(100)
, @FOLDER_PATH NVARCHAR(500)
, @PICTURE_FILE_NAME NVARCHAR(500)
)
AS
BEGIN
DECLARE @Binary VARBINARY (max);
DECLARE @OutputPath NVARCHAR(4000);
DECLARE @Obj INT
SELECT @Binary = (
SELECT CONVERT(VARBINARY(max), PICTURE_DATA , 1)
FROM T_BINARY_DATA
WHERE PICTURE_NAME = @PICTURE_NAME
);
SET @OutputPath = CONCAT(@FOLDER_PATH, '\', @PICTURE_FILE_NAME);
BEGIN TRY
EXEC sp_OACreate 'ADODB.Stream', @Obj OUTPUT;
EXEC sp_OASetProperty @Obj ,'Type',1;
EXEC sp_OAMethod @Obj,'Open';
EXEC sp_OAMethod @Obj,'Write', NULL, @Binary;
EXEC sp_OAMethod @Obj,'SaveToFile', NULL, @OutputPath, 2;
EXEC sp_OAMethod @Obj,'Close';
EXEC sp_OADestroy @Obj;
END TRY
BEGIN CATCH
EXEC sp_OADestroy @Obj;
END CATCH
SET NOCOUNT OFF
END
GO
अब हम किसी भी क्लाइंट एप्लिकेशन से इन प्रक्रियाओं का उपयोग बहुत ही सरल तरीके से कर सकते हैं।
आइए कल्पना करें कि हमारे पास C:\Pictures\Inp . में चित्र हैं फ़ोल्डर। इन चित्रों को लोड करने के लिए, हमें निम्नलिखित कोड निष्पादित करने की आवश्यकता है:
-- Load picture to table row
exec dbo.proc_ImportBinary ‘MyPic’, ‘C:\Pictures\Inp’, ‘MyPic.jpg’
इसी तरह से हम डेटा को C:\Pictures\Out . पर निर्यात कर सकते हैं फ़ोल्डर:
exec dbo.proc_ExportBinary ‘MyPic’, ‘C:\Pictures\Out’, ‘MyPic.jpg’
निष्कर्ष
बाइनरी ऑब्जेक्ट्स या डेटाबेस में बाइनरी डेटा संग्रहीत करने के वैकल्पिक साधनों के बीच चुनाव (उदाहरण के लिए, डेटाबेस में फ़ाइल पथ संग्रहीत करना और उन्हें डिस्क/क्लाउड स्टोरेज से पुनर्प्राप्त करना) कई कारकों पर निर्भर करता है।
सामान्य नियम यह है कि यदि फ़ाइल आकार में 256 किलोबाइट से कम है, तो आपको इसे VARBINARY कॉलम में संग्रहीत करना चाहिए। यदि बाइनरी फ़ाइलें एक मेगाबाइट से बड़ी हैं, तो आपको उन्हें फ़ाइल सिस्टम पर संग्रहीत करना चाहिए। यदि आपके पास SQL सर्वर संस्करण 2008 और इसके बाद के संस्करण में FILESTREAM उपलब्ध है, तो यह डेटाबेस के तार्किक भाग के रूप में फ़ाइलों को लेन-देन नियंत्रण में रखता है।
यदि आप SQL सर्वर तालिका में बाइनरी फ़ाइलों को संग्रहीत करने का निर्णय लेते हैं, तो केवल बाइनरी सामग्री के लिए एक अलग तालिका का उपयोग करें। फिर आप इसके भंडारण स्थान को अनुकूलित कर सकते हैं और इंजन तक पहुंच सकते हैं, शायद इस तालिका के लिए अलग-अलग फ़ाइलें और फ़ाइल समूह का उपयोग कर रहे हैं। विस्तृत जानकारी आधिकारिक Microsoft आलेख में उपलब्ध है।
किसी भी मामले में, दोनों दृष्टिकोणों का परीक्षण करें और अपनी आवश्यकताओं के अनुरूप सबसे अच्छा उपयोग करें।