SQLite
 sql >> डेटाबेस >  >> RDS >> SQLite

SQLite कॉलम प्रकार कितने लचीले/प्रतिबंधित हैं?

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

<मजबूत>ध्यान दें! यह असनर अजीब और अद्भुत कॉलम प्रकारों के उपयोग की अनुशंसा नहीं कर रहा है।

1) आप वास्तव में किसी स्तंभ प्रकार के लिए किसी भी नाम का उपयोग कर सकते हैं, हालांकि कुछ सीमाएं हैं।

2) कॉलम परिभाषा में कॉलम प्रकार दूसरा मान है उदा। CREATE TABLE table (columnname columntype .....,....) , हालांकि इसे जानबूझकर या शायद अनजाने में छोड़ा जा सकता है नोट देखें 5a)

3) पहली सीमा यह है कि mycolumn INTEGER PRIMARY KEY या mycolumn INTEGER PRIMARY KEY AUTOINCREMENT एक विशेष स्तंभ प्रकार है। कॉलम rowid . के लिए एक उपनाम है जो एक अद्वितीय अंकीय पहचानकर्ता है (AUTOINCREMENT एक नियम लागू करता है कि पंक्तिबद्ध तालिका के लिए पिछली बार उपयोग की गई पंक्ति से अधिक होना चाहिए उदा। यदि कोई पंक्ति आईडी (9223372036854775807) का उपयोग करती है, तो बाद में पंक्ति जोड़ने के किसी भी प्रयास के परिणामस्वरूप SQLITE पूर्ण त्रुटि होगी। ) SQLite Autoincrement

4) अन्य सीमाएं हैं कि कॉलम प्रकार को SQLite पार्सर को भ्रमित नहीं करना चाहिए। उदाहरण के लिए प्राथमिक, तालिका, इंडेक्स के कॉलम प्रकार के परिणामस्वरूप SQLite अपवाद होगा (वाक्यविन्यास त्रुटि (कोड 1) ) जैसे जब INDEX के कॉलम प्रकार का उपयोग किया जाता है तो:-

android.database.sqlite.SQLiteException: near "INDEX": syntax error (code 1):

होता है।

5) एक कॉलम प्रकार अनिवार्य नहीं है, उदाहरण के लिए CREATE TABLE mytable (...,PRIMARY_COL,.... इस मामले में एक PRAGMA TABLE_INFO(tablename) कोई प्रकार नहीं दिखाएगा उदा। (तीसरी पंक्ति)।

08-08 07:56:23.391 13097-13097/? D/TBL_INFO: Col=cid Value=8
08-08 07:56:23.391 13097-13097/? D/ TBLINFO: Col=name Value=PRIMARY_COL
08-08 07:56:23.391 13097-13097/? D/ TBLINFO: Col=type Value=
08-08 07:56:23.391 13097-13097/? D/ TBLINFO: Col=notnull Value=1
08-08 07:56:23.391 13097-13097/? D/ TBLINFO: Col=dflt_value Value=null
08-08 07:56:23.391 13097-13097/? D/ TBLINFO: Col=pk Value=0

5a) कुछ मामलों में SQLite पार्सर मान्य कीवर्ड पर छोड़ देगा उदा। CREATE TABLE mytable (mycolumn NOT NULL,... परिणाम NOT NULL NOT NULL को इंगित करने के लिए उपयोग किया जा रहा है कॉलम और प्रकार कोई प्रकार नहीं . के रूप में लिया जा रहा है (उपरोक्त तालिका_इन्फो वास्तव में इस तरह के उपयोग से थी)।

6) एक प्रकार एक शब्द तक सीमित नहीं है उदा। VARYING CHARACTER(255) या THE BIG BAD WOLF एक प्रकार के रूप में निर्दिष्ट किया जा सकता है जैसा कि इस तालिका_इन्फो अर्क से देखा जा सकता है :-

08-08 08:23:26.423 4799-4799/? D/   TBLINFO: Col=type Value=THE BIG BAD WOLF

SQLite में गैर-मानक कॉलम प्रकारों का उपयोग करने का कारण!

संक्षेप में नहीं . है कारण, जैसा कि पहले बताया गया है, कॉलम प्रकारों का लचीलापन मुख्य रूप से अन्य डेटाबेस प्रबंधन प्रणालियों से एसक्यूएल के आसान अनुकूलन को पूरा करने के लिए प्रतीत होता है।

कॉलम प्रकारों का स्वयं पर बहुत कम प्रभाव पड़ता है क्योंकि SQLite द्वारा उपयोग किए जाने वाले भंडारण वर्ग के रूप में निर्धारित डेटा के अनुसार डेटा संग्रहीत किया जाएगा। पंक्तिबद्ध . के अपवाद के साथ (देखें 3) ऊपर) कोई भी कॉलम किसी भी प्रकार के मान रख सकता है।

ब्लॉब के रूप में संग्रहीत डेटा के अपवाद के साथ, जिसे cursor.getBlob का उपयोग करके पुनर्प्राप्त किया जाना चाहिए और उस कर्सर.गेटब्लॉब का उपयोग बीएलओबी के रूप में संग्रहीत डेटा के लिए नहीं किया जा सकता है (getBlob टेक्स्ट के रूप में संग्रहीत डेटा के साथ विफल नहीं होता है), आप किसी भी cursor.get???? तरीके।

यहां कुछ उदाहरण दिए गए हैं:-

उस कॉलम के लिए जहां डेटा long myINT = 556677888; जोड़ा जाता है (ContentValues ​​के माध्यम से जैसे cv1.put(columnanme,myINT) );

तब :-

08-08 09:19:03.657 13575-13575/mjt.soqanda D/ColTypes: Column=INTEGER_COL<<
08-08 09:19:03.657 13575-13575/mjt.soqanda D/ColTypes:  VALUE AS INT >>556677888<<
08-08 09:19:03.657 13575-13575/mjt.soqanda D/ColTypes:  VALUE AS LONG >>556677888<<
08-08 09:19:03.657 13575-13575/mjt.soqanda D/ColTypes:  VALUE AS STRING >>556677888<<
08-08 09:19:03.657 13575-13575/mjt.soqanda D/ColTypes:  VALUE AS DOUBLE >>5.56677888E8<<
08-08 09:19:03.657 13575-13575/mjt.soqanda D/ColTypes:  VALUE AS FLOAT >>5.566779E8<<
08-08 09:19:03.657 13575-13575/mjt.soqanda D/ColTypes:  VALUE AS SHORT >>15104<<
08-08 09:19:03.657 13575-13575/mjt.soqanda D/ColTypes:      Unable to handle with getBlob.

getShort संग्रहीत मान पर वापस नहीं आता है, getBlob संग्रहीत मान प्राप्त नहीं कर सकता है।

Double myREAL = 213456789.4528791134567890109643534276; के लिए :-

08-08 09:19:03.658 13575-13575/mjt.soqanda D/ColTypes: Column=REAL_COL<<
08-08 09:19:03.658 13575-13575/mjt.soqanda D/ColTypes:  VALUE AS INT >>213456789<<
08-08 09:19:03.658 13575-13575/mjt.soqanda D/ColTypes:  VALUE AS LONG >>213456789<<
08-08 09:19:03.658 13575-13575/mjt.soqanda D/ColTypes:  VALUE AS STRING >>2.13457e+08<<
08-08 09:19:03.658 13575-13575/mjt.soqanda D/ColTypes:  VALUE AS DOUBLE >>2.134567894528791E8<<
08-08 09:19:03.658 13575-13575/mjt.soqanda D/ColTypes:  VALUE AS FLOAT >>2.1345678E8<<
08-08 09:19:03.658 13575-13575/mjt.soqanda D/ColTypes:  VALUE AS SHORT >>6037<<
08-08 09:19:03.658 13575-13575/mjt.soqanda D/ColTypes:      Unable to handle with getBlob.

String myTEXT = "The Lazy Quick Brown Fox Jumped Over the Fence or something like that.";

08-08 09:19:03.657 13575-13575/mjt.soqanda D/ColTypes: Column=TEXT_COL<<
08-08 09:19:03.657 13575-13575/mjt.soqanda D/ColTypes:  VALUE AS INT >>0<<
08-08 09:19:03.657 13575-13575/mjt.soqanda D/ColTypes:  VALUE AS LONG >>0<<
08-08 09:19:03.657 13575-13575/mjt.soqanda D/ColTypes:  VALUE AS STRING >>The Lazy Quick Brown Fox Jumped Over the Fence or something like that.<<
08-08 09:19:03.657 13575-13575/mjt.soqanda D/ColTypes:  VALUE AS DOUBLE >>0.0<<
08-08 09:19:03.657 13575-13575/mjt.soqanda D/ColTypes:  VALUE AS FLOAT >>0.0<<
08-08 09:19:03.657 13575-13575/mjt.soqanda D/ColTypes:  VALUE AS SHORT >>0<<
08-08 09:19:03.657 13575-13575/mjt.soqanda D/ColTypes:  VALUE AS BLOB >>[[email protected]<<

और यहां my_char_is_not_a_char_but_an_int के कॉलम प्रकार के साथ एक बहुत ही हास्यास्पद उदाहरण दिया गया है PRAGMA TABLE_INFO . के अनुसार :-

08-08 09:19:03.657 13575-13575/mjt.soqanda D/TBL_INFO: Col=cid Value=7
08-08 09:19:03.657 13575-13575/mjt.soqanda D/   TBLINFO: Col=name Value=my_char_is_not_a_char_but_an_int_COL
08-08 09:19:03.657 13575-13575/mjt.soqanda D/   TBLINFO: Col=type Value=my_char_is_not_a_char_but_an_int
08-08 09:19:03.657 13575-13575/mjt.soqanda D/   TBLINFO: Col=notnull Value=0
08-08 09:19:03.657 13575-13575/mjt.soqanda D/   TBLINFO: Col=dflt_value Value=null
08-08 09:19:03.657 13575-13575/mjt.soqanda D/   TBLINFO: Col=pk Value=0

परिणाम (उपरोक्त 'डबल' के अनुसार संग्रहीत) हैं:-

08-08 09:19:03.659 13575-13575/mjt.soqanda D/ColTypes: Column=my_char_is_not_a_char_but_an_int_COL<<
08-08 09:19:03.659 13575-13575/mjt.soqanda D/ColTypes:  VALUE AS INT >>213456789<<
08-08 09:19:03.659 13575-13575/mjt.soqanda D/ColTypes:  VALUE AS LONG >>213456789<<
08-08 09:19:03.659 13575-13575/mjt.soqanda D/ColTypes:  VALUE AS STRING >>2.13457e+08<<
08-08 09:19:03.659 13575-13575/mjt.soqanda D/ColTypes:  VALUE AS DOUBLE >>2.134567894528791E8<<
08-08 09:19:03.659 13575-13575/mjt.soqanda D/ColTypes:  VALUE AS FLOAT >>2.1345678E8<<
08-08 09:19:03.659 13575-13575/mjt.soqanda D/ColTypes:  VALUE AS SHORT >>6037<<
08-08 09:19:03.659 13575-13575/mjt.soqanda D/ColTypes:      Unable to handle with getBlob.

उपरोक्त निम्नलिखित पर आधारित था:- SQLite संस्करण 3 में डेटाटाइप्स SQLite Autoincrement PRAGMA Statements

कोड को GenyMotion एमुलेटेड डिवाइस पर परीक्षण/चलाया गया था जो API22 पर चल रहा था जिसे 14 के न्यूनतम संस्करण और 26 के लक्ष्य के साथ संकलित किया गया था।




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. SQLite IN

  2. सिंगलटन दृष्टिकोण के साथ SQLite स्मृति समस्या

  3. Android में sqlite डेटाबेस को अपडेट और कॉम्पैक्ट करना

  4. एकाधिक तालिकाओं के साथ काम करने के लिए सर्वोत्तम अभ्यास

  5. SQLite डेटाबेस <table_name>(column) पर Android L . को अपग्रेड करने के बाद स्वचालित अनुक्रमणिका चेतावनी देता है