ประเภทของค่าบูลใน SQLite คืออะไร ฉันต้องการเก็บไว้ในตาราง TRUE / FALSE ค่าของฉัน
ฉันสามารถสร้างคอลัมน์ของ INTEGER และเก็บไว้ในนั้นค่า 0 หรือ 1 แต่มันจะไม่เป็นวิธีที่ดีที่สุดในการใช้ประเภท BOOL
มีวิธีหรือไม่?
ขอบคุณ
ประเภทของค่าบูลใน SQLite คืออะไร ฉันต้องการเก็บไว้ในตาราง TRUE / FALSE ค่าของฉัน
ฉันสามารถสร้างคอลัมน์ของ INTEGER และเก็บไว้ในนั้นค่า 0 หรือ 1 แต่มันจะไม่เป็นวิธีที่ดีที่สุดในการใช้ประเภท BOOL
มีวิธีหรือไม่?
ขอบคุณ
คำตอบ:
ไม่มีชนิดข้อมูลบูลีนดั้งเดิมสำหรับ SQLite ตามเอกสารประเภทข้อมูล :
SQLite ไม่มีคลาสหน่วยเก็บข้อมูลบูลีนแยกต่างหาก แต่ค่าบูลีนจะถูกเก็บเป็นจำนวนเต็ม 0 (เท็จ) และ 1 (จริง)
ใน 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
ประเภทข้อมูล 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, นี่คือการสอน
ผมได้ให้คำตอบที่นี่ มันใช้งานได้สำหรับพวกเขา
Boolean flag2 = (intValue != 0);
การใช้ชนิดข้อมูลจำนวนเต็มกับค่า 0 และ 1 เป็นวิธีที่เร็วที่สุด
เพิ่มเติมจากคำตอบของ 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
แต่ถ้าคุณต้องการที่จะเก็บพวงของพวกเขาคุณสามารถบิตกะพวกเขาและเก็บพวกเขาทั้งหมดเป็นหนึ่ง 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 ในจำนวนเต็มหนึ่งห้องเพื่อดูข้อมูลเพิ่มเติม
คุณสามารถทำให้สมการข้างบนง่ายขึ้นโดยใช้สิ่งต่อไปนี้:
boolean flag = sqlInt != 0;
หากการเป็นตัวแทน int (sqlInt) ของบูลีนเป็น 0 (เท็จ) บูลีน (ธง) จะเป็นเท็จมิฉะนั้นมันจะเป็นจริง
รหัสรัดกุมดีกว่าเสมอที่จะทำงานกับ :)
อีกวิธีในการทำคือคอลัมน์ TEXT แล้วแปลงค่าบูลีนระหว่างบูลีนและสตริงก่อน / หลังการบันทึก / อ่านค่าจากฐานข้อมูล
อดีต คุณมี"boolValue = true;
"
เพื่อสตริง:
//convert to the string "TRUE"
string StringValue = boolValue.ToString;
และกลับไปที่บูลีน:
//convert the string back to boolean
bool Boolvalue = Convert.ToBoolean(StringValue);