संबंधित SQLite डेटा-प्रकार जैसे INT, INTEGER, SMALLINT और TINYINT में क्या अंतर है?


101

SQLite3 में एक तालिका बनाते समय, मैं सभी संभावित डेटाटिप्स के साथ सामना करते समय भ्रमित हो जाता हूं, जो समान सामग्री को प्रभावित करता है, तो क्या कोई मुझे निम्नलिखित डेटा-प्रकारों के बीच का अंतर बता सकता है?

INT, INTEGER, SMALLINT, TINYINT

DEC, DECIMAL

LONGCHAR, LONGVARCHAR

DATETIME, SMALLDATETIME

क्या कहीं पर कुछ दस्तावेज हैं जो min./max को सूचीबद्ध करते हैं। विभिन्न डेटा प्रकार की क्षमता? उदाहरण के लिए, मुझे लगता है कि पूर्णांक की तुलना smallintमें एक बड़ा अधिकतम मूल्य है tinyint, लेकिन पूर्णांक की तुलना में एक छोटा मूल्य है, लेकिन मुझे यह पता नहीं है कि ये क्षमता क्या हैं।

जवाबों:


95

SQLite, तकनीकी रूप से, कोई डेटा प्रकार नहीं है, एक मैनिफ़ेस्ट टाइपिंग सिस्टम में स्टोरेज क्लासेस हैं , और हाँ, यह भ्रमित करने वाला है यदि आप पारंपरिक RDBMSएसई के लिए उपयोग किए जाते हैं । आंतरिक रूप से, सब कुछ, पाठ के रूप में संग्रहीत किया जाता है। डेटा प्रकार समरूपता (स्तंभों को सौंपे गए डेटा प्रकार) के आधार पर विभिन्न भंडारण स्थानों में परिवर्तित / परिवर्तित किए जाते हैं।

सबसे अच्छी बात जो मैं आपको सुझाऊँगा वह है:

  1. स्टैंडअलोन डेटाबेस डेटाटाइप के बारे में आपके द्वारा उपयोग की जाने वाली सभी चीज़ों को अस्थायी रूप से भूल जाएं

  2. SQLiteसाइट से उपरोक्त लिंक पढ़ें ।

  3. अपने पुराने स्कीमा के आधार पर प्रकारों को लें, और देखें कि वे किस मानचित्र में अंदर आएंगे SQLite

  4. SQLiteडेटाबेस के लिए सभी डेटा माइग्रेट करें ।

नोट: डेटाटाइप सीमाएँ बोझिल हो सकती हैं, खासकर यदि आप समय अवधि, या दिनांक, या उस प्रकृति की चीजों को जोड़ते हैं SQLSQLiteउस चीज़ के लिए बहुत कम अंतर्निहित कार्य हैं। हालाँकि, लाइब्रेरी फ़ंक्शन के SQLiteमाध्यम से आपके लिए अपने स्वयं के अंतर्निहित कार्यों को समय अवधि और उस प्रकृति की चीजों को जोड़ने के लिए एक आसान तरीका प्रदान करता है sqlite3_create_function। आप पारंपरिक संग्रहित प्रक्रियाओं के स्थान पर उस सुविधा का उपयोग करेंगे।


1
उत्तर और लिंक के लिए धन्यवाद। क्या इसका मतलब यह है कि मुझे मूल प्रकार के पाठ, संख्यात्मक, पूर्णांक, वास्तविक, किसी से नहीं चिपकना चाहिए? मेरे लिए बहुत सीमित लगता है, विशेष रूप से एक MSSQL, फॉक्सप्रो और ओरेकल पृष्ठभूमि से। सादर।
एलन हैरिस-रीड

6
मैं आपसे सहमत हूं, यह पहली बार में सीमित लगता है। हालाँकि, मुझे लगता है कि आप पाएंगे कि SQLite डेटाबेस में डेटा को अपनी आत्मीयता के माध्यम से कैसे क्षमा करता है। SQLite स्टैंडअलोन नहीं है - यह एक छोटे डेटाबेस बैकएंड के रूप में डिज़ाइन किया गया है जिसे आप छोटे अनुप्रयोगों में केवल डेटाबेस एक्सेस एपीआई कोड के माध्यम से एक्सेस करने के लिए रखते हैं। SQLite में समस्याओं का समाधान आमतौर पर यह पता लगाने की बात है कि वे आपको कैसे करना चाहते हैं।
जे। पॉलीफ

मैं मूल प्रकारों से चिपका रहूंगा।
जे। पॉलीफ

4
@Alan: आप इसे उपयोगी के रूप में संख्यात्मक-आत्मीयता स्तंभ घोषित करने के लिए मिल सकती है DATEया BOOLEANहै, लेकिन मैं पूर्णांकों के विभिन्न आकारों के बीच भेद परेशान नहीं होता। यह विशेष रूप से के मामले के लिए सच है INTEGER PRIMARY KEY, एक मामला जहां सटीक प्रकार नाम मायने रखता है।
दान ०४

"सब कुछ पाठ के रूप में संग्रहीत किया जाता है" के लिए गलत अनुसार हो रहा है sqlite.org/fileformat.html , जो कहते हैं संख्या कॉम्पैक्ट varints / float64, और केवल ब्लॉब और पाठ स्ट्रिंग्स के रूप में संग्रहीत किया जाता है के रूप में जमा हो जाती है
phiresky

47

अंतर सिंटैक्टिक शुगर है। टाइप एफिनिटी के संबंध में टाइप नाम के केवल कुछ ही पदार्थ मायने रखते हैं।

  • INT, INTEGER, SMALLINT, TINYINT → INTEGER आत्मीयता, क्योंकि इन सभी में "INT" होता है।
  • LONGCHAR, LONGVARCHAR → पाठ आत्मीयता, क्योंकि उनमें "CHAR" होता है।
  • DEC, DECIMAL, DATETIME, SMALLDATETIME → NUMERIC, क्योंकि इनमें कोई भी ऐसा पदार्थ नहीं है, जो पदार्थ में हो।

आत्मीयता का निर्धारण करने के नियम SQLite साइट पर सूचीबद्ध हैं ।

यदि आप सख्त टाइपिंग पर जोर देते हैं , तो आप इसे CHECKबाधाओं के साथ लागू कर सकते हैं :

CREATE TABLE T (
   N   INTEGER CHECK(TYPEOF(N) = 'integer'),
   Str TEXT CHECK(TYPEOF(Str) = 'text'),
   Dt  DATETIME CHECK(JULIANDAY(Dt) IS NOT NULL)
);

लेकिन मैं इससे कभी परेशान नहीं होता।

प्रत्येक प्रकार की क्षमता के लिए:

  • INTEGERहमेशा 64-बिट पर हस्ताक्षर किए जाते हैं। ध्यान दें कि SQLite का अनुकूलन करता है छोटे-छोटे पूर्णांकों भंडारण को पीछे छोड़ देता है, इसलिए TINYINT वैसे भी उपयोगी नहीं होगा।
  • REALहमेशा 64-बिट ( double) है।
  • TEXTऔर BLOBएक अधिकतम आकार एक पूर्वप्रक्रमक मैक्रो द्वारा निर्धारित किया जाता है, जो 1,000,000,000 बाइट्स को डिफॉल्ट करता है।

1
अच्छी चाल। कृपया ध्यान दें कि इस दृष्टिकोण के लिए एक ही भंडारण वर्ग के समान मूल्य-से-डाला / अद्यतन की आवश्यकता होती है TYPEOF। इसलिए, एक पाठ सम्मिलित करने का प्रयास जो अन्यथा NQERIC / INTEGER भंडारण वर्ग में SQlite द्वारा परिवर्तित किया जाएगा (यानी, इस तरह के रूपांतरण sqlite.org/datatype3.html#affinity के अनुसार दोषरहित है ) विफल हो जाएगा। दूसरे शब्दों में यह दृष्टिकोण मूल्य डालने के तदर्थ दृष्टिकोण की तुलना में कठोर है और फिर किसी तरह जादुई तरीके से उस मूल्य को SQLite द्वारा संग्रहीत करने के लिए उपयोग किया जाता है। अधिक अनुमेय दृष्टिकोण के लिए, नीचे मेरा उत्तर देखें।
21

10

उनमें से ज्यादातर संगतता के लिए वहाँ हैं। आपके पास वास्तव में केवल पूर्णांक, फ्लोट, पाठ और बूँद है। तिथियों को एक संख्या के रूप में संग्रहीत किया जा सकता है (यूनिक्स समय पूर्णांक है, Microsoft समय फ्लोट है) या पाठ के रूप में।


मैंने इसे वेब आधारित परियोजनाओं के लिए उपयोग किया है जहां अंततः सब कुछ समाप्त हो गया है वैसे भी एक html पृष्ठ में पाठ डाल दिया गया है। मैंने बहुत सारे डेटा रूपांतरण के साथ वितरण किया और अधिकांश स्तंभों के लिए पाठ का उपयोग किया। इसने अच्छा काम किया।
Jay

3

NULL। मान एक NULL मान है।

INTEGER। मान एक हस्ताक्षरित पूर्णांक है, जो मूल्य के परिमाण के आधार पर 1, 2, 3, 4, 6, या 8 बाइट्स में संग्रहीत है।

REAL। मान एक फ़्लोटिंग पॉइंट मान है, जिसे 8-बाइट IEEE फ़्लोटिंग पॉइंट संख्या के रूप में संग्रहीत किया जाता है।

TEXT। मान एक पाठ स्ट्रिंग है, जिसे डेटाबेस एन्कोडिंग (UTF-8, UTF-16BE या UTF-16LE) का उपयोग करके संग्रहीत किया जाता है।

BLOB। मान डेटा का एक ब्लॉब है, जो इनपुट के समान ही संग्रहीत है।


1

Dan04 से उत्तर देने के अतिरिक्त, यदि आप नेत्रहीन रूप NUMERICसे शून्य के अलावा किसी अन्य का प्रतिनिधित्व करना चाहते हैं, TEXTलेकिन यह सुनिश्चित करें कि पाठ संख्यात्मक के लिए परिवर्तनीय है:

your_numeric_col NUMERIC CHECK(abs(your_numeric_col) <> 0)

विशिष्ट उपयोग का मामला एक ऐसे प्रोग्राम से क्वेरी में है जो सभी डेटा को पाठ के रूप में मानता है (एकरूपता और सरलता के लिए, क्योंकि SQLite पहले से ही करता है)। इसके बारे में अच्छी बात यह है कि यह इस तरह से निर्माण की अनुमति देता है:

INSERT INTO table (..., your_numeric_column, ...) VALUES (..., some_string, ...)

यदि आप प्लेसहोल्डर का उपयोग कर रहे हैं तो यह सुविधाजनक है क्योंकि आपको ऐसे गैर-शून्य संख्यात्मक क्षेत्रों को विशेष रूप से संभालना नहीं है। पायथन के sqlite3मॉड्यूल का उपयोग करने वाला एक उदाहरण होगा,

conn_or_cursor.execute(
    "INSERT INTO table VALUES (" + ",".join("?" * num_values) + ")",   
    str_value_tuple)  # no need to convert some from str to int/float

उपरोक्त उदाहरण में, str_value_tupleSQlite को पास किए जाने पर सभी मान बच जाएंगे और स्ट्रिंग के रूप में उद्धृत किए जाएंगे। हालाँकि, चूंकि हम स्पष्ट रूप से टाइप नहीं कर रहे हैं, TYPEOFलेकिन केवल परिवर्तनीयता टाइप करने के लिए , यह अभी भी वांछित के रूप में काम करेगा (यानी, SQLite इसे एक संख्यात्मक के रूप में संग्रहीत करेगा या अन्यथा विफल होगा)।

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