เก็บค่าบูลีนใน SQLite


284

ประเภทของค่าบูลใน SQLite คืออะไร ฉันต้องการเก็บไว้ในตาราง TRUE / FALSE ค่าของฉัน

ฉันสามารถสร้างคอลัมน์ของ INTEGER และเก็บไว้ในนั้นค่า 0 หรือ 1 แต่มันจะไม่เป็นวิธีที่ดีที่สุดในการใช้ประเภท BOOL

มีวิธีหรือไม่?

ขอบคุณ


2
ความเป็นไปได้ที่ซ้ำกันของบูลีนมีตัวอักษรใน SQLite หรือไม่?
Joshua Pinter

คำตอบ:


365

ไม่มีชนิดข้อมูลบูลีนดั้งเดิมสำหรับ SQLite ตามเอกสารประเภทข้อมูล :

SQLite ไม่มีคลาสหน่วยเก็บข้อมูลบูลีนแยกต่างหาก แต่ค่าบูลีนจะถูกเก็บเป็นจำนวนเต็ม 0 (เท็จ) และ 1 (จริง)


24
"INTEGER ค่านี้เป็นจำนวนเต็มแบบมีลายเซ็นซึ่งเก็บใน 1, 2, 3, 4, 6 หรือ 8 ไบต์ขึ้นอยู่กับขนาดของค่า" ฉันเดาว่าใช้ 1 ไบต์เพื่อจัดเก็บ BOOL ก็ไม่ได้แย่
joce

2
ส่งตรงจากปากของ Horse: "SQLite ไม่มีคลาสหน่วยเก็บข้อมูลบูลีนแยกต่างหากค่าบูลีนจะถูกเก็บเป็นจำนวนเต็ม 0 (เท็จ) และ 1 (จริง)"
โทเบียส

3
ซึ่งจะดีกว่าในแง่ของประสิทธิภาพ! จริง / เท็จเป็นสตริงหรือจำนวนเต็ม 0/1?
มูฮัมหมัดบาบาร์

9
@ MuhammadBabar 0/1 แน่นอนที่สุด เงื่อนไขจะช้าลงและใช้พื้นที่มากขึ้น
Davor

1
@joce ที่จริงแล้วจำนวนเต็ม 0 และ 1 (รวมถึง NULL) จะถูกเข้ารหัสโดยตรงในการประกาศชนิดข้อมูลแถว ดังนั้นจึงเป็นศูนย์ไบต์ต่อบูลีนถ้าคุณนับเฉพาะการจัดเก็บข้อมูลจริงซึ่งยอดเยี่ยม หากคุณนับการทำบัญชีแบบคอลัมน์ต่อแถวต่อแถวที่จำเป็นต้องใช้ในรูปแบบไฟล์ประเภทข้อมูลทั้งหมดจะมีไบต์ที่ต้องการเพิ่มซึ่งไม่น่ากลัว :) (การอ้างอิง: sqlite.org/fileformat.html#record_format )
ค่อนข้าง

93

ใน SQLite สิ่งที่ดีที่สุดที่คุณสามารถทำได้คือใช้จำนวนเต็ม 0 และ 1 เพื่อแทนค่า false และ true คุณสามารถประกาศประเภทคอลัมน์ดังนี้:

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

งดเว้นNOT NULLถ้าคุณต้องการอนุญาตNULLเพิ่มเติมจาก 0 และ 1

การใช้ชื่อประเภทBOOLEANที่นี่เป็นที่สำหรับการอ่านเพื่อ SQLite เป็นเพียงชนิดที่มีความใกล้ชิดกับตัวเลข

โปรดทราบว่าข้อ จำกัด การตรวจสอบได้รับการสนับสนุนตั้งแต่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 ด้วยวิธีนี้:

int flag = (boolValue)? 1 : 0;

คุณสามารถแปลง int กลับเป็นบูลีนได้ดังนี้:

 // 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, นี่คือการสอน
ผมได้ให้คำตอบที่นี่ มันใช้งานได้สำหรับพวกเขา


13
บรรทัดสุดท้ายของโค้ดอาจเป็น "Boolean flag2 = (intValue == 1)"
cja

16
ฉันแนะนำBoolean flag2 = (intValue != 0);
Hamzeh Soboh

หรือคุณสามารถทำบูลีน flag2 = (intValue> 0);
Efrain Sanjay Adhikary


5

เพิ่มเติมจากคำตอบของ ericwa ข้อ จำกัด การตรวจสอบสามารถเปิดใช้งานคอลัมน์หลอกบูลีนโดยการบังคับใช้ประเภทข้อมูล TEXT และอนุญาตเฉพาะค่าเฉพาะกรณี 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

แต่ถ้าคุณต้องการที่จะเก็บพวงของพวกเขาคุณสามารถบิตกะพวกเขาและเก็บพวกเขาทั้งหมดเป็นหนึ่ง int เล็กน้อยเช่นสิทธิ์ไฟล์ unix / โหมด

สำหรับโหมด 755 ตัวอย่างเช่นแต่ละหลักหมายถึงคลาสที่แตกต่างกันของผู้ใช้: เจ้าของกลุ่มสาธารณะ ภายในแต่ละตัวมีการอ่าน 4 หลัก 2 คือเขียน 1 ดำเนินการดังนั้น 7 ทั้งหมดของพวกเขาเช่นไบนารี 111 5 อ่านและดำเนินการ 101 ดังนั้นสร้างรูปแบบการเข้ารหัสของคุณเอง

ฉันแค่เขียนอะไรบางอย่างสำหรับการจัดเก็บข้อมูลตารางทีวีจาก Schedules Direct และฉันมีไบนารีหรือใช่ / ไม่ใช่ฟิลด์: สเตอริโอ, hdtv, ใหม่, ei, คำบรรยายภาพใกล้, dolby, sap ในภาษาสเปน, รอบปฐมทัศน์ฤดูกาล ดังนั้น 7 บิตหรือจำนวนเต็มสูงสุด 127 ตัวละครตัวหนึ่งจริงๆ

ตัวอย่าง AC จากสิ่งที่ฉันกำลังทำอยู่ตอนนี้ has () เป็นฟังก์ชันที่ส่งคืน 1 ถ้าสตริงที่ 2 อยู่ในสตริงแรก 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 booleans ในจำนวนเต็มหนึ่งห้องเพื่อดูข้อมูลเพิ่มเติม


คำตอบนี้ช่างอบอุ่นใจในมุมมอง CS :)
varun

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
@Craig แม็คมาแนะนำให้ใช้จำนวนเต็มแทน: ตัวเลขที่สำคัญแทนจริงเฉพาะที่ไม่ใช่ตัวแทนเท็จ
Berik

18
ฉันพบว่าน่ารังเกียจอย่างยิ่ง @Berik ทางออกที่ชัดเจนคือการแสดงคำว่า "TRUE" หรือ "FALSE" ลงบนภาพแล้วบันทึกลงในแถวฐานข้อมูลเป็น BLOB ที่เข้ารหัสด้วย JPEG หนึ่งสามารถอ่านค่ากลับมาได้โดยใช้อัลกอริธึมการแยกคุณลักษณะอย่างง่าย
Craig McMahon
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.