SQLite में बूलियन मान संग्रहीत करें


284

SQLite में BOOL मान के लिए प्रकार क्या है? मैं अपनी तालिका TRUE / FALSE मानों में संग्रहीत करना चाहता हूं।

मैं INTEGER का एक कॉलम बना सकता हूं और इसमें 0 या 1 मान स्टोर कर सकता हूं, लेकिन यह BOOL प्रकार को लागू करने का सबसे अच्छा तरीका नहीं होगा।

क्या उधर रास्ता है?

धन्यवाद।


जवाबों:


365

SQLite के लिए कोई मूल बूलियन डेटा प्रकार नहीं है। प्रति डेटाेटस प्रति :

SQLite में एक अलग बूलियन स्टोरेज क्लास नहीं है। इसके बजाय, बूलियन मान को पूर्णांक 0 (गलत) और 1 (सत्य) के रूप में संग्रहीत किया जाता है।


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

2
सीधे घोड़े के मुंह से: "SQLite में एक अलग बूलियन भंडारण वर्ग नहीं है। इसके बजाय, बूलियन मान को पूर्णांक 0 (गलत) और 1 (सच) के रूप में संग्रहीत किया जाता है।"
तोबियों

3
जो प्रदर्शन की अवधि में बेहतर है! सच / झूठ के रूप में तार या 0/1 पूर्णांक?
मुहम्मद बाबर

9
@ मुहम्मद बबर 0/1 सबसे निश्चित रूप से। स्ट्रिंग्स धीमी हैं और अधिक स्थान लेती हैं।
डावोर

1
@joce वास्तव में, पूर्णांक 0 और 1 (साथ ही NULL) पंक्ति डेटा प्रकार घोषणा में सीधे एन्कोडेड हैं। तो यह बूलियन प्रति शून्य बाइट्स है, यदि आप केवल वास्तविक डेटा स्टोरेज की गणना करते हैं, जो भयानक है। यदि आप फ़ाइल प्रारूप द्वारा आवश्यक प्रति-स्तंभ-प्रति-पंक्ति बहीखाता की गणना करते हैं, हालांकि, सभी डेटा प्रकारों में एक अतिरिक्त बाइट की आवश्यकता होती है, जो भयानक नहीं है। :) (संदर्भ: sqlite.org/fileformat.html#record_format )
अपेक्षाकृत_ब्रांड

93

SQLite में आप जो भी कर सकते हैं, वह पूर्ण और सत्य का प्रतिनिधित्व करने के लिए पूर्णांक 0 और 1 का उपयोग करता है। आप कॉलम के प्रकार को इस तरह घोषित कर सकते हैं:

CREATE TABLE foo(mycolumn BOOLEAN NOT NULL CHECK (mycolumn IN (0,1)));

NOT NULLयदि आप NULL0 और 1 के अलावा अनुमति देना चाहते हैं तो Omit करें ।

BOOLEANयहाँ टाइप नाम का उपयोग पठनीयता के लिए है, SQLite के लिए यह केवल NUMERIC आत्मीयता के साथ एक प्रकार है ।

ध्यान दें कि CHECK की कमी SQLite 3.3.0 (2006) के बाद से समर्थित है ।

यहाँ कुछ उदाहरण INSERT हैं जो काम करेंगे: (ध्यान दें कि स्ट्रिंग्स और फ़्लोटिंग पॉइंट नंबर पूर्णांक के रूप में पार्स किए गए हैं)

sqlite> INSERT INTO foo VALUES(0);
sqlite> INSERT INTO foo VALUES(1);
sqlite> INSERT INTO foo VALUES(0.0);
sqlite> INSERT INTO foo VALUES(1.0);
sqlite> INSERT INTO foo VALUES("0.0");
sqlite> INSERT INTO foo VALUES("1.0");
sqlite> select mycolumn, typeof(mycolumn) from foo;
0|integer
1|integer
0|integer
1|integer
0|integer
1|integer

और कुछ जो विफल हो जाएगा:

sqlite> INSERT INTO foo VALUES("-1");
Error: constraint failed
sqlite> INSERT INTO foo VALUES(0.24);
Error: constraint failed
sqlite> INSERT INTO foo VALUES(100);
Error: constraint failed
sqlite> INSERT INTO foo VALUES(NULL);
Error: foo.mycolumn may not be NULL
sqlite> INSERT INTO foo VALUES("true");
Error: constraint failed
sqlite> INSERT INTO foo VALUES("false");
Error: constraint failed

86

SQLite बूलियन डेटाटाइप:
SQLite में एक अलग बूलियन स्टोरेज क्लास नहीं है। इसके बजाय, बूलियन मान को पूर्णांक 0 (झूठा) और 1 (सत्य) के रूप में संग्रहीत किया जाता है।

आप इस तरह से बूलियन को इंट में बदल सकते हैं:

int flag = (boolValue)? 1 : 0;

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

 // Select COLUMN_NAME  values from db. 
 // This will be integer value, you can convert this int value back to Boolean as follows
Boolean flag2 = (intValue == 1)? true : false;

यदि आप साइक्लाइट का अन्वेषण करना चाहते हैं, तो यहां एक ट्यूटोरियल है
मैंने यहाँ एक उत्तर दिया है । यह उनके लिए काम कर रहा है।


13
कोड की अंतिम पंक्ति बस "बूलियन flag2 = (intValue == 1)" हो सकता है
CJA

16
मेरा सुझाव हैBoolean flag2 = (intValue != 0);
हमज़ेह सोबोह

या आप सिर्फ बूलियन फ्लैग 2 कर सकते हैं = (intValue> 0);
एफ़्रेन संजय आदिकारी


5

आगे इरिकावा का जवाब। CHECK बाधाएं एक पाठ स्तंभ को लागू करके एक छद्म बूलियन कॉलम को सक्षम कर सकती हैं और केवल TRUE या FALSE केस विशिष्ट मानों की अनुमति देती हैं।

CREATE TABLE IF NOT EXISTS "boolean_test"
(
    "id" INTEGER PRIMARY KEY AUTOINCREMENT
,   "boolean" TEXT NOT NULL 
        CHECK( typeof("boolean") = "text" AND
               "boolean" IN ("TRUE","FALSE")
        )
);

INSERT INTO "boolean_test" ("boolean") VALUES ("TRUE");
INSERT INTO "boolean_test" ("boolean") VALUES ("FALSE");
INSERT INTO "boolean_test" ("boolean") VALUES ("TEST");

Error: CHECK constraint failed: boolean_test

INSERT INTO "boolean_test" ("boolean") VALUES ("true");

Error: CHECK constraint failed: boolean_test

INSERT INTO "boolean_test" ("boolean") VALUES ("false");

Error: CHECK constraint failed: boolean_test

INSERT INTO "boolean_test" ("boolean") VALUES (1);

Error: CHECK constraint failed: boolean_test

select * from boolean_test;

id  boolean
1   TRUE
2   FALSE

5

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

उदाहरण के लिए मोड 755 के लिए, प्रत्येक अंक उपयोगकर्ताओं के एक अलग वर्ग को संदर्भित करता है: स्वामी, समूह, सार्वजनिक। प्रत्येक अंक के भीतर 4 को पढ़ा जाता है, 2 को लिखा जाता है, 1 को निष्पादित किया जाता है इसलिए 7 उन सभी को बाइनरी 111 की तरह है। 5 को पढ़ा जाता है और इसलिए 101 को निष्पादित करता है। अपनी खुद की एन्कोडिंग योजना बनाएं।

मैं सिर्फ शेड्यूल डायरेक्ट से टीवी शेड्यूल डेटा को स्टोर करने के लिए कुछ लिख रहा हूं और मेरे पास बाइनरी या हां / नो फील्ड्स हैं: स्टीरियो, hdtv, new, ei, close captioned, dolby, sap in Spanish, season प्रीमियर। तो 7 बिट्स, या अधिकतम 127 के साथ एक पूर्णांक। एक चरित्र वास्तव में।

अब मैं जो काम कर रहा हूं, उससे एसी उदाहरण। has () एक फ़ंक्शन है जो 1 रिटर्न देता है यदि दूसरा स्ट्रिंग पहले एक में है। inp इस फंक्शन का इनपुट स्ट्रिंग है। misc 0 का इनिशियलाइज्ड चार है।

if (has(inp,"sap='Spanish'") > 0)
  misc += 1;
if (has(inp,"stereo='true'") > 0)
  misc +=2;
if (has(inp,"ei='true'") > 0)
  misc +=4;
if (has(inp,"closeCaptioned='true'") > 0)
  misc += 8;
if (has(inp,"dolby=") > 0)
  misc += 16;
if (has(inp,"new='true'") > 0)
  misc += 32;
if (has(inp,"premier_finale='") > 0)
  misc += 64;
if (has(inp,"hdtv='true'") > 0)
  misc += 128;

इसलिए मैं एक कमरे में 7 बूलियनों को अधिक के लिए कमरे के साथ संग्रहीत कर रहा हूं।


यह उत्तर एक सीएस परिप्रेक्ष्य में बहुत दिल से है। :)
वरुण

2

आप निम्न का उपयोग करके उपरोक्त समीकरणों को सरल बना सकते हैं:

boolean flag = sqlInt != 0;

यदि बूलियन का int प्रतिनिधित्व (sqlInt) 0 (झूठा) है, तो बूलियन (ध्वज) गलत होगा, अन्यथा यह सच होगा।

संक्षिप्त कोड हमेशा साथ काम करने के लिए अच्छा है :)


-4

इसे करने का दूसरा तरीका एक TEXT कॉलम है। और फिर डेटाबेस से मान को सहेजने / पढ़ने से पहले / बाद में बूलियन और स्ट्रिंग के बीच बूलियन मान में कनवर्ट करें।

पूर्व। आपके पास है "boolValue = true;

तार:

//convert to the string "TRUE"
string StringValue = boolValue.ToString;  

और बूलियन पर वापस जाएं:

//convert the string back to boolean
bool Boolvalue = Convert.ToBoolean(StringValue);

6
@ क्रेग मैकमोहन के बजाय पूर्णांक का उपयोग करने का सुझाव देते हैं: अभाज्य संख्याएँ सही का प्रतिनिधित्व करती हैं, गैर-प्राइम झूठ का प्रतिनिधित्व करते हैं
बेरिक

18
मुझे लगता है कि अत्यधिक आक्रामक, @Berik। स्पष्ट समाधान छवि पर "TRUE" या "FALSE" शब्द को रेंडर करना है और फिर डेटाबेस पंक्ति में JPEG- एन्कोडेड BLOB के रूप में सहेजें। एक तो एक साधारण सुविधा निष्कर्षण एल्गोरिथ्म का उपयोग करके मूल्य वापस पढ़ सकता है।
क्रेग मैकमोहन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.