SQLite

2009-05-09 17 views
202

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

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

क्या कोई तरीका है?

धन्यवाद।

+0

के संभावित डुप्लिकेट [वहाँ SQLite में एक बूलियन शाब्दिक है?] (Http://stackoverflow.com/questions/2510652/is- वहां-ए-बूलियन-शाब्दिक-इन-स्क्लाइट) –

उत्तर

277

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

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

+13

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

+1

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

+2

प्रदर्शन की अवधि में कौन सा बेहतर है! स्ट्रिंग या 0/1 पूर्णांक के रूप में सही/गलत? –

77

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

आप इस तरह से int करने के लिए बूलियन परिवर्तित कर सकते हैं:

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; 

आप SQLite पता लगाने के लिए चाहते हैं, here is a tutorial
मैंने एक उत्तर दिया है here। यह उनके लिए काम कर रहा है।

+12

कोड की अंतिम पंक्ति केवल "बूलियन फ्लैग 2 = (intValue == 1)" – cja

+10

हो सकती है, मैं सुझाव देता हूं कि 'बूलियन फ्लैग 2 = (intValue!= 0); ' –

+0

या आप बस बूलियन flag2 = (intValue> 0) कर सकते हैं; –

7

मूल्य 0 और 1 के साथ इंटीजर डेटा प्रकार का उपयोग कर सबसे तेज़ है।

-3

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

पूर्व। सबसे अच्छा तुम कर सकते हो पूर्णांकों 0 और 1 का उपयोग गलत और सही का प्रतिनिधित्व करने के लिए है

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

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

+13

का प्रतिनिधित्व करती हैं, मुझे लगता है कि अत्यधिक आक्रामक, @ बेरिक। स्पष्ट समाधान एक छवि पर "TRUE" या "FALSE" शब्द प्रस्तुत करना है और उसके बाद डेटाबेस पंक्ति में एक जेपीईजी-एन्कोडेड BLOB के रूप में सहेजना है। फिर एक साधारण सुविधा निष्कर्षण एल्गोरिदम का उपयोग करके मूल्य वापस पढ़ सकता है। –

55

SQLite में: आप स्ट्रिंग के लिए "boolValue = true; "

है:

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

और वापस बूलियन करने के लिए। आप इस तरह के कॉलम प्रकार की घोषणा कर सकते हैं:

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

को छोड़ देंआप यह सिर्फ एक प्रकार with NUMERIC affinity है SQLite 0 और 1.

प्रकार का नाम BOOLEAN यहाँ के उपयोग पठनीयता के लिए है के अलावा NULL अनुमति देने के लिए, चाहते हैं।

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

यहां कुछ उदाहरण आवेषण हैं कि काम करेगा: (ध्यान दें कैसे तार और चल बिन्दु संख्या पूर्णांक के रूप में पार्स किए जाते हैं)

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 
1

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

boolean flag = sqlInt != 0; 

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

संक्षिप्त कोड हमेशा आगे ericwa के जवाब देने के लिए :)

4

साथ काम करने के अच्छे है। जांच बाधाएं एक टेक्स्ट डुटाइप टाइप करके छद्म बूलियन कॉलम सक्षम कर सकती हैं और केवल 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 
3

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

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

मैं सिर्फ अनुसूची डायरेक्ट से टीवी शेड्यूल डेटा संग्रहीत करने के लिए कुछ लिख रहा हूं और मेरे पास द्विआधारी या हां/नहीं फ़ील्ड हैं: स्टीरियो, एचडीटीवी, नया, ईआई, क्लोज कैप्शन, डॉल्बी, स्पेनिश में सीजन प्रीमियर। तो 7 बिट्स, या अधिकतम 127 के साथ एक पूर्णांक। वास्तव में एक चरित्र।

अब से मैं जो काम कर रहा हूं उससे एक सी उदाहरण। है() एक ऐसा फ़ंक्शन है जो 1 स्ट्रिंग करता है यदि दूसरी स्ट्रिंग पहले में होती है। inp इस फ़ंक्शन के लिए इनपुट स्ट्रिंग है। विविध एक अहस्ताक्षरित चार 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 बूलियन्स भंडारण कर रहा हूँ के लिए शुरू है।

-1

अद्यतन तालिका सेट Boolcolumn = '1' कहां ......

+1

इस मुद्दे के जवाब के साथ कुछ स्पष्टीकरण जोड़ें कि इस मुद्दे को वर्तमान समस्या को ठीक करने में ओपी की मदद कैसे करें –