मुख्य सामग्री पर जाएँ

SQLite डेटा टाइप्स: स्टोरेज क्लासेस पर गहराई से नज़र

SQLite के डायनेमिक टाइप सिस्टम के साथ काम करना सीखें और टाइप एफिनिटी, स्टोरेज क्लासेस, और STRICT मोड जैसी सुविधाओं का उपयोग कर बेहतर डेटा अखंडता पाएं।
· 8 मि॰ पढ़ें

AI के साथ खोजें

SQLite स्टोरेज क्लासेस और टाइप एफिनिटी पर आधारित एक लचीला टाइप सिस्टम इस्तेमाल करता है। पारंपरिक RDBMSs जो सख्त टाइपिंग लागू करते हैं, उनके विपरीत, SQLite अधिक डायनेमिक टाइप हैंडलिंग की अनुमति देता है। इस मॉडल को समझना डेटा स्थिरता सुनिश्चित करने और एप्लिकेशन लॉजिक में सूक्ष्म बग से बचने के लिए महत्वपूर्ण है।

इस लेख में, मैं SQLite टाइप सिस्टम की पड़ताल करूंगा और दिखाऊंगा कि SQLite में आम डेटा टाइप्स के साथ कैसे काम करें। यदि आप SQL में नए हैं, तो मजबूत नींव बनाने के लिए हमारे Introduction to SQL कोर्स से शुरुआत करने पर विचार करें। साथ ही, मुझे SQL Basics Cheat Sheet, जिसे आप डाउनलोड कर सकते हैं, एक सहायक संदर्भ लगता है क्योंकि इसमें अधिकांश सामान्य SQL फ़ंक्शंस शामिल हैं।

SQLite के टाइप सिस्टम के मूल सिद्धांत

SQLite के साथ काम करने के लिए, यह समझना ज़रूरी है कि वह आंतरिक रूप से डेटा कैसे संग्रहीत और व्याख्यायित करता है। नीचे मैं समझाऊंगा कि SQLite-टाइप सिस्टम कैसे भरोसेमंद और कुशल एप्लिकेशन डिज़ाइन करता है।

स्टोरेज क्लासेस का विवरण

SQLite मानों को आंतरिक रूप से दर्शाने के लिए पाँच स्टोरेज क्लासेस का उपयोग करता है:

  • NULL किसी गायब या अपरिभाषित मान का प्रतिनिधित्व करता है।

  • INTEGER एक साइन किया हुआ पूर्णांक है जो परिमाण के आधार पर 1 से 8 बाइट्स में संग्रहीत होता है।

  • REAL 8-बाइट IEEE-754 मान के रूप में संग्रहीत फ्लोटिंग-पॉइंट संख्या का वर्णन करता है।

  • TEXT UTF-8, UTF-16BE, या UTF-16LE में एन्कोडेड टेक्स्ट स्ट्रिंग्स संग्रहीत करता है।

  • BLOB बाइनरी डेटा को बिना किसी रूपांतरण के ठीक उसी तरह संग्रहीत करता है जैसा इनपुट हुआ हो।

SQLite Data Types

SQLite डेटा टाइप्स। इमेज स्रोत: OpenAI

ये स्टोरेज क्लासेस टेबल स्कीमा में घोषित डेटा टाइप्स से भिन्न होते हैं। कोई कॉलम VARCHAR(50) या BOOLEAN के रूप में घोषित हो सकता है, लेकिन वास्तविक मान उसकी सामग्री के आधार पर पाँच स्टोरेज क्लासेस में से किसी एक का उपयोग करके संग्रहीत होता है। यह पृथक्करण SQLite को उसका डायनेमिक और क्षमाशील स्वभाव देता है, पर साथ ही डेवलपर्स से अपेक्षा करता है कि वे अपने एप्लिकेशन कोड में डेटा वैलिडेशन और टाइप स्थिरता पर ध्यान दें।

टाइप एफिनिटी और कॉलम का व्यवहार

SQLite में टाइप एफिनिटी वह अनुशंसित टाइप है जो किसी कॉलम को उसके घोषित डेटा टाइप के आधार पर सौंपा जाता है। घोषित टाइप के टेक्स्ट से एफिनिटी निर्धारित करने के लिए SQLite निम्न नियमों का उपयोग करता है।

  • जो कॉलम VARCHAR, CHAR, या TEXT के रूप में घोषित हैं, उन्हें TEXT एफिनिटी मिलती है।

  • INT और INTEGER जैसे टाइप्स को INTEGER एफिनिटी मिलती है।

  • DECIMAL, NUMERIC, या BOOLEAN जैसी डिक्लेरेशन को NUMERIC एफिनिटी मिलती है।

  • REAL, FLOAT, या DOUBLE जैसे टाइप्स को REAL एफिनिटी मिलती है।

  • यदि कोई पहचाना हुआ टाइप घोषित नहीं है, तो एफिनिटी डिफ़ॉल्ट रूप से BLOB होती है।

उदाहरण के लिए, VARCHAR(100) के रूप में घोषित कॉलम में TEXT एफिनिटी होगी, यानी SQLite स्टोर करते समय मानों को टेक्स्ट में बदलने की कोशिश करेगा। यह एफिनिटी बताती है कि SQLite डेटा को कैसे परिवर्तित और संग्रहीत करता है, लेकिन उस कॉलम में अन्य टाइप के मान संग्रहीत करने पर रोक नहीं लगाती।

मैनिफेस्ट टाइपिंग और उसके निहितार्थ

SQLite मैनिफेस्ट टाइपिंग का उपयोग करता है, यानी डेटा टाइप कॉलम कंटेनर से नहीं, बल्कि व्यक्तिगत मान से संबद्ध होता है। यह एक ही कॉलम में एकाधिक प्रकार के मानों को सह-अस्तित्व की अनुमति देता है। उदाहरण के लिए, INTEGER के रूप में घोषित कॉलम में TEXT या BLOB मान हो सकते हैं।

मैनिफेस्ट टाइपिंग डेवलपर्स को स्कीमा बदले बिना विविध डेटा टाइप्स डालने देती है। हालांकि, इसका समझौता यह है कि यह असंगत डेटा, अप्रत्याशित सॉर्टिंग, और टाइप नियम लागू करने के लिए एप्लिकेशन लॉजिक पर अधिक निर्भरता तक ले जा सकता है।

मैं हमारे Database Design कोर्स को लेने की सलाह देता/देती हूं ताकि आप डेटाबेस प्रबंधन में विभिन्न डेटा टाइप्स में डेटा व्यवस्थित करना और डेटाबेस मैनेज करना सीख सकें।

SQLite में सामान्य डेटा टाइप्स के साथ काम करना

अब देखते हैं कि SQLite में टेक्स्ट, नंबर, बूलियन, दिनांक, और बाइनरी डेटा जैसे सामान्य डेटा टाइप्स को कैसे संभाला जाए।

टेक्स्ट, नंबर, और बूलियन

SQLite में सामान्यतः उपयोग की जाने वाली डेटा घोषणाओं में TEXT, INTEGER, REAL, NUMERIC, और BOOLEAN शामिल हैं, लेकिन मान सख्त टाइप्स के बजाय टाइप एफिनिटी के आधार पर संग्रहीत होते हैं। नीचे प्रत्येक डेटा टाइप के वास्तविक-विश्व स्कीमा में उपयोग के मामले दिए गए हैं।

  • TEXT स्ट्रिंग्स संग्रहीत करता है, जो नाम, ईमेल, URLs और सामान्य टेक्स्टुअल डेटा के लिए उपयुक्त है।

  • INTEGER काउंट, IDs, और कोड जैसे पूर्णांकों के लिए आदर्श है, जो कुशल स्टोरेज और सॉर्टिंग प्रदान करता है।

  • REAL माप, मुद्रा, या गैर-पूर्णांक मानों के लिए फ्लोटिंग-पॉइंट संख्याएँ संग्रहीत करता है।

  • NUMERIC एफिनिटी DECIMAL, BOOLEAN, या समान रूप से घोषित मानों को कवर करती है। मान के आधार पर, SQLite इन्हें INTEGER या REAL के रूप में संग्रहीत करने की कोशिश करता है।

  • BOOLEAN कोई नैटिव स्टोरेज क्लास नहीं है, बल्कि पृष्ठभूमि में 0 (FALSE) या 1 (TRUE) को INTEGER मानों के रूप में संग्रहीत कर सिम्युलेट किया जाता है।

मैं बूलियन के लिए INTEGER का उपयोग करने और एप्लिकेशन-साइड पर स्पष्ट बाधाएं लगाने की सलाह देता/देती हूं, जबकि लचीले नंबर पार्सिंग की आवश्यकता वाले मानों के लिए NUMERIC उपयुक्त है।

दिनांक, समय, और टेम्पोरल रणनीतियाँ

SQLite में नैटिव DATE या DATETIME टाइप नहीं है, लेकिन टेम्पोरल डेटा संग्रहीत करने के लिए निम्न प्रारूपों का समर्थन करता है:

  • TEXT: दिनांक/समय को ISO8601 स्ट्रिंग्स जैसे YYYY-MM-DD HH:MM:SS के रूप में संग्रहीत करता है। यह प्रारूप मानव-पठनीय है और कई टूल्स के साथ संगत है, लेकिन तुलनाओं के लिए धीमा हो सकता है।

  • REAL: दिनांक को जूलियन डे नंबर (फ्लोटिंग-पॉइंट) के रूप में संग्रहीत करता है, जो दिनांक गणित और रेंज क्वेरी के लिए उपयोगी है, लेकिन कम पठनीय है।

  • INTEGER: यूनिक्स टाइमस्टैम्प्स, 1970-01-01 से सेकंड में संग्रहीत करता है। यह स्टोरेज के लिए कुशल है और संख्यात्मक तुलनाएँ तेज करता है, लेकिन मानव-पठनीय नहीं है।

टेम्पोरल डेटा के साथ काम करते समय, आप इन फ़ंक्शंस का उपयोग कर सकते हैं: date(), time(), datetime(), julianday(), और strftime() पार्सिंग, फ़ॉर्मेटिंग, और टेम्पोरल प्रारूपों के बीच रूपांतरण के लिए।

बाइनरी और संख्यात्मक किनारी स्थितियाँ

SQLite BLOB स्टोरेज क्लास के माध्यम से बाइनरी डेटा का भी समर्थन करता है। BLOBs छवियों, फाइलों, या किसी भी गैर-टेक्स्टुअल डेटा को संग्रहीत करने के लिए उपयोगी हैं। BLOB डेटा टाइप्स के साथ काम करते समय, हमेशा पैरामीटराइज़्ड क्वेरीज़ या बाइंडिंग्स का उपयोग करके BLOBs डालें। आप बड़े बाइनरी को बाहरी रूप से भी संग्रहीत कर सकते हैं और उन्हें पाथ या हैश के साथ संदर्भित कर सकते हैं।

जहां SQLite 8 बाइट्स तक के पूर्णांक (-2^63 से 2^63-1) संग्रहीत कर सकता है, इस सीमा से परे मान चुपचाप REAL डेटा टाइप में बदले जा सकते हैं। इससे मानों की प्रीसिशन खो सकती है। SQLite में दशमलव प्रीसिशन के लिए सख्त प्रवर्तन का अभाव है, इसलिए जब आपको प्रीसिशन चाहिए, तो वित्तीय डेटा के लिए हमेशा बाहरी लाइब्रेरीज़ या एप्लिकेशन लॉजिक का उपयोग करें।

STRICT टेबल्स के साथ संरचना लागू करना

पारंपरिक लचीले टाइपिंग सिस्टम के विपरीत, SQLite ने संस्करण 3.37.0 में STRICT टेबल्स पेश किए। एक STRICT टेबल सख्त टाइपिंग मोड प्रदान करता है जो कॉलम मानों के लिए सटीक टाइप मैचिंग लागू करता है। जब आप किसी टेबल को STRICT के रूप में घोषित करते हैं, तो डाला गया हर मान कॉलम के घोषित टाइप से मेल खाना चाहिए, और कोई भी असंगति त्रुटि का कारण बनती है। 

STRICT मोड डेटा स्थिरता और वैलिडेशन में सुधार करता है। यह विकास के दौरान टाइप-संबंधी त्रुटियों को जल्दी पकड़ने में भी मदद करता है और SQLite के व्यवहार को अधिक पूर्वानुमेय बनाता है, जो पारंपरिक RDBMSs के करीब है।

डेवलपर के रूप में STRICT का उपयोग करने से पहले, ध्यान दें कि यह केवल SQLite 3.37.0 और उससे ऊपर में उपलब्ध है। साथ ही, आप एक ही टेबल में STRICT और मैनिफेस्ट टाइपिंग को मिक्स नहीं कर सकते।

प्रदर्शन और डिज़ाइन संबंधी विचार

SQLite में एक लचीला टाइप सिस्टम है जिसके प्रदर्शन पर प्रभाव पड़ते हैं। INTEGER और REAL मानों के लिए SQLite वैरिएबल-लेंथ एन्कोडिंग का उपयोग करता है, यानी छोटे नंबर कम बाइट्स का उपयोग करते हैं। यह विशेष रूप से बड़े डेटासेट्स के लिए डेटाबेस का आकार कम करने में मदद करता है। 

टाइप एफिनिटी यह भी प्रभावित करती है कि मान कैसे संग्रहीत और तुलना किए जाते हैं। किसी कॉलम में असंगत टाइप्स इंडेक्स की प्रभावशीलता को कम कर सकते हैं, क्योंकि लुकअप के दौरान SQLite अतिरिक्त टाइप रूपांतरण कर सकता है, जिससे क्वेरी धीमी हो जाती हैं।

कुशल स्कीमा और क्वेरी डिज़ाइन करने के लिए निम्नलिखित रणनीतियों पर विचार करें।

  • टाइप कोअर्शन के ओवरहेड को कम करने के लिए कॉलम्स को स्पष्ट और सुसंगत एफिनिटी के साथ परिभाषित करें।

  • लगातार व्यवहार सुनिश्चित करने के लिए, जब टाइप रूपांतरण की आवश्यकता हो, तो क्वेरीज़ में स्पष्ट कास्टिंग पर विचार करें।

  • संख्यात्मक IDs और काउंटर के लिए INTEGER एफिनिटी, फ्लोटिंग-पॉइंट डेटा के लिए REAL, और स्ट्रिंग्स के लिए TEXT का उपयोग करें।

  • सॉर्टिंग और तुलना की विचित्रताओं से बचने के लिए एक ही कॉलम में डेटा टाइप्स को मिक्स करने से बचें।

  • अनावश्यक टाइप कोअर्शन या डेटा डुप्लिकेशन से बचने के लिए स्कीमा को नॉर्मलाइज़ करें।

  • प्रदर्शन का विश्लेषण करने और क्वेरीज़ को फाइन-ट्यून करने के लिए EXPLAIN QUERY PLAN का उपयोग करें।

स्कीमा पैटर्न्स के साथ SQLite डेटा टाइप उदाहरण

निम्नलिखित टेबल स्कीमा SQLite के डेटा टाइप्स, टाइप एफिनिटी, और बाधाओं के विचारशील उपयोग का उदाहरण देते हैं।

बूलियन सिमुलेशन और बाधाओं के साथ Users टेबल

नीचे दिए गए उदाहरण में:

  • is_active INTEGER के साथ CHECK बाधा का उपयोग करके बूलियन का सिमुलेशन करता है।

  • TEXT डेटा टाइप स्ट्रिंग मानों के लिए स्थिरता सुनिश्चित करता है जबकि INTEGER बूलियन-जैसी लॉजिक के लिए है।

 -- Create users table with auto-incrementing rowid and enforce uniqueness
CREATE TABLE users (
    id INTEGER PRIMARY KEY, 
    username TEXT NOT NULL UNIQUE, 
    email TEXT NOT NULL, 
    is_active INTEGER NOT NULL DEFAULT 1 CHECK (is_active IN (0, 1))  -- Simulates boolean
);

टेम्पोरल डेटा और संख्यात्मक प्रीसिशन का उपयोग करती Orders टेबल

नीचे दी गई क्वेरी में, total एप्लिकेशन स्तर पर प्रीसिशन संभालने के लिए मुद्रा-जैसे मानों हेतु NUMERIC का उपयोग करता है। order_date को ISO-8601 प्रारूप में TEXT के रूप में संग्रहीत किया जाता है, जिससे पठनीयता और दिनांक फ़ंक्शंस के साथ संगतता सुनिश्चित होती है।

-- Create orders table with row identifier and foreign key in practice
-- ISO date format "YYYY-MM-DD"
CREATE TABLE orders (
    order_id INTEGER PRIMARY KEY,  
    customer_id INTEGER NOT NULL, 
    total NUMERIC NOT NULL, 
    order_date TEXT NOT NULL CHECK (length(order_date) = 10)  );

बाइनरी और टाइप जाँच के साथ Files टेबल

नीचे दी गई क्वेरी में, content कच्चा बाइनरी डेटा संग्रहीत करने के लिए BLOB का उपयोग करता है। uploaded_at समय को स्पेस और प्रदर्शन दक्षता के लिए INTEGER के रूप में संग्रहीत करता है।

-- Create files table with raw binary data and Unix timestamp (epoch seconds)
CREATE TABLE files (
    file_id INTEGER PRIMARY KEY, 
    name TEXT NOT NULL, 
    content BLOB NOT NULL,  
    uploaded_at INTEGER NOT NULL 
);

आप रनटाइम पर निम्न क्वेरी से टाइप सत्यापित कर सकते हैं:

SELECT typeof(uploaded_at), typeof(content) FROM files;

मैं हमारे Introduction to Relational Databases in SQL कोर्स को लेने की सलाह देता/देती हूं ताकि आप डेटा संरचनाओं और डेटाबेस में टेबल बनाना और अधिक सीख सकें।

अन्य डेटाबेस के साथ SQLite की तुलना

SQLite का टाइप सिस्टम पारंपरिक RDBMSs जैसे MySQL या PostgreSQL की तुलना में अधिक लचीला है। नीचे दी गई तालिका SQLite की इन डेटाबेस से तुलना करती है।

फ़ीचर

SQLite

MySQL

PostgreSQL

टाइपिंग मॉडल

डायनेमिक (मैनिफेस्ट टाइपिंग, टाइप एफिनिटी)

सख्त (कुछ विचित्रताओं के साथ, जैसे साइलेंट कोअर्शन)

सख्त (स्ट्रॉन्ग टाइपिंग लागू)

डिक्लेयर किए गए टाइप का प्रवर्तन

लागू नहीं (जब तक STRICT मोड उपयोग न हो)

अधिकांशतः लागू, पर कुछ लचीलापन अनुमति

पूरी तरह लागू

बूलियन हैंडलिंग

0/1, TEXT, NUMERIC की तरह सिम्युलेटेड

BOOLEAN टाइप है (TRUE, FALSE)

नैटिव BOOLEAN टाइप

दिनांक/समय टाइप्स

मैन्युअली TEXT, REAL, या INTEGER के रूप में संग्रहीत

नैटिव दिनांक/समय टाइप्स

नैटिव और व्यापक टेम्पोरल टाइप्स

इंडेक्स संवेदनशीलता

किसी कॉलम में मिश्रित टाइप्स के प्रति संवेदनशील

टाइपिंग के कारण विश्वसनीय

टाइपिंग के कारण विश्वसनीय

स्कीमा लचीलापन

बहुत अधिक (डिफ़ॉल्ट रूप से कम बाधाएं)

मध्यम

संरचित और मज़बूत

SQLite में माइग्रेशन

सख्त टाइप प्रवर्तन शिथिल करना पड़ सकता है

आम तौर पर मामूली समायोजनों के साथ सुगम

सरलीकरण या प्रीसिशन की हानि की आवश्यकता हो सकती है

SQLite से माइग्रेशन

डेटा क्लीनअप और टाइपिंग साधारीकरण आवश्यक

अधिक सख्त टाइपिंग के अनुरूपता की आवश्यकता

अनुरूपता और अधिक सख्त स्कीमा की आवश्यकता

निष्कर्ष

SQLite में एक लचीला टाइपिंग सिस्टम है जो सोच-समझकर उपयोग किए जाने पर अलग-अलग लाभ देता है। स्टोरेज क्लासेस, टाइप एफिनिटी, और मैनिफेस्ट टाइपिंग को समझकर डेवलपर्स ऐसे स्कीमा डिज़ाइन कर सकते हैं जो अनुकूलनशीलता और विश्वसनीयता के बीच संतुलन बनाते हैं। STRICT टेबल्स, सुसंगत टाइप उपयोग, और नॉर्मलाइज़ेशन जैसी विशेषताएँ आवश्यकता पड़ने पर संरचना लागू करने में मदद करती हैं।

अगले चरण के रूप में, मैं हमारे Exploratory Data Analysis in SQL और Data Manipulation in SQL कोर्स लेने की सलाह देता/देती हूं ताकि आप उन्नत SQL क्वेरीज़ का उपयोग करके विभिन्न डेटा टाइप्स के डेटा का विश्लेषण करना सीख सकें।

Allan Ouko

लेखक

Allan Ouko

डेटा एनालिटिक्स, बिज़नेस इंटेलिजेंस और डेटा साइंस में व्यावहारिक अनुभव रखने वाला डेटा साइंस तकनीकी लेखक। मैं SQL, Python, Power BI, Databricks और डेटा इंजीनियरिंग पर व्यावहारिक, उद्योग-केंद्रित सामग्री लिखता/लिखती हूँ, जो वास्तविक दुनिया की एनालिटिक्स कार्य से जुड़ी होती है। मेरी लेखनी तकनीकी गहराई और व्यावसायिक प्रभाव के बीच पुल का काम करती है, जिससे पेशेवरों को डेटा को आत्मविश्वासपूर्ण निर्णयों में बदलने में मदद मिलती है. 

FAQs

SQLite के स्टोरेज क्लासेस क्या हैं?

SQLite स्टोरेज क्लासेस में NULL, INTEGER, REAL, TEXT, और BLOB शामिल हैं।

क्या एक कॉलम में कई डेटा टाइप्स संग्रहीत हो सकते हैं?

हाँ, जब तक टेबल को STRICT के रूप में घोषित नहीं किया गया है, कोई भी कॉलम विभिन्न टाइप्स के मान रख सकता है।

SQLite में टाइप एफिनिटी क्या है?

टाइप एफिनिटी किसी कॉलम के लिए उसके घोषित टाइप के आधार पर अनुशंसित टाइप है। SQLite डाले गए मानों को कॉलम की एफिनिटी टाइप में बदलने की कोशिश करता है, लेकिन इसे सख्ती से लागू नहीं करता।

SQLite में BOOLEAN मानों को कैसे संभाला जाता है?

SQLite में अलग से BOOLEAN टाइप नहीं है। बूलियन मान आमतौर पर INTEGER के रूप में संग्रहीत किए जाते हैं, 0 (FALSE) या 1 (TRUE), NUMERIC एफिनिटी का उपयोग करते हुए।

मैं कैसे जाँच सकता/सकती हूँ कि कोई मान कैसे संग्रहीत है?

किसी मान के वास्तविक स्टोरेज क्लास का निरीक्षण करने के लिए typeof() फ़ंक्शन का उपयोग करें।

विषय