Simpan nilai boolean dalam SQLite

284

Apa jenis nilai BOOL dalam SQLite? Saya ingin menyimpan nilai nilai TRUE / FALSE di meja saya.

Saya bisa membuat kolom INTEGER dan menyimpannya bernilai 0 atau 1, tetapi itu bukan cara terbaik untuk mengimplementasikan tipe BOOL.

Apakah ada cara?

Terima kasih.

Ilya Suzdalnitski
sumber
2
kemungkinan duplikat Apakah ada boolean literal dalam SQLite?
Joshua Pinter

Jawaban:

365

Tidak ada tipe data boolean asli untuk SQLite. Per dokumen Datatypes :

SQLite tidak memiliki kelas penyimpanan Boolean yang terpisah. Sebaliknya, nilai-nilai Boolean disimpan sebagai bilangan bulat 0 (salah) dan 1 (benar).

Lasse V. Karlsen
sumber
24
"INTEGER. Nilainya adalah bilangan bulat yang ditandatangani, disimpan dalam 1, 2, 3, 4, 6, atau 8 byte tergantung pada besarnya nilainya." Saya kira menggunakan 1 byte untuk menyimpan BOOL tidak terlalu buruk.
joce
2
Langsung dari mulut Kuda: "SQLite tidak memiliki kelas penyimpanan Boolean yang terpisah. Sebaliknya, nilai-nilai Boolean disimpan sebagai integer 0 (false) dan 1 (true)."
Tobias
3
Mana yang lebih baik dalam hal kinerja! benar / salah sebagai string atau 0/1 integer?
Muhammad Babar
9
@MuhammadBabar 0/1 pasti. String lebih lambat dan membutuhkan lebih banyak ruang.
Davor
1
@ joce Sebenarnya, integer 0 dan 1 (serta NULL) dikodekan langsung dalam deklarasi tipe data baris. Jadi nol byte per boolean, jika Anda hanya menghitung penyimpanan data aktual, yang mengagumkan. Jika Anda menghitung pembukuan per kolom-per-baris yang diperlukan oleh format file, semua tipe data memiliki byte tambahan yang diperlukan, yang tidak mengagumkan. :) (referensi: sqlite.org/fileformat.html#record_format )
relatively_random
93

Dalam SQLite yang terbaik yang dapat Anda lakukan adalah menggunakan bilangan bulat 0 dan 1 untuk mewakili false dan true. Anda dapat mendeklarasikan jenis kolom seperti ini:

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

Hapus NOT NULLjika Anda ingin memperbolehkan NULLselain 0 dan 1.

Penggunaan nama tipe di BOOLEANsini adalah untuk keterbacaan, untuk SQLite itu hanya tipe dengan afinitas NUMERIC .

Perhatikan bahwa PERIKSA kendala telah didukung sejak SQLite 3.3.0 (2006).

Berikut adalah beberapa contoh INSERT yang akan berfungsi: (perhatikan bagaimana string dan angka floating point diuraikan sebagai bilangan bulat)

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

dan beberapa yang akan gagal:

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
ericwa
sumber
86

SQLite Boolean Datatype:
SQLite tidak memiliki kelas penyimpanan Boolean yang terpisah. Sebaliknya, nilai-nilai Boolean disimpan sebagai bilangan bulat 0 (salah) dan 1 (benar).

Anda dapat mengonversi boolean ke int dengan cara ini:

int flag = (boolValue)? 1 : 0;

Anda dapat mengonversi int kembali ke boolean sebagai berikut:

 // 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;

Jika Anda ingin menjelajahi sqlite, berikut adalah tutorialnya .
Saya telah memberikan satu jawaban di sini . Ini bekerja untuk mereka.

Muhammad Nabeel Arif
sumber
13
baris terakhir kode bisa saja "Boolean flag2 = (intValue == 1)"
cja
16
Saya sarankanBoolean flag2 = (intValue != 0);
Hamzeh Soboh
atau Anda bisa melakukan Boolean flag2 = (intValue> 0);
Efrain Sanjay Adhikary
7

menggunakan tipe data Integer dengan nilai 0 dan 1 adalah yang tercepat.

Logvinov Alecksey
sumber
5

Selanjutnya jawaban ericwa. PERIKSA kendala dapat mengaktifkan kolom pseudo boolean dengan memberlakukan tipe data TEXT dan hanya mengizinkan nilai spesifik kasus yang BENAR atau SALAH misalnya.

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
Martin Hurford
sumber
5

Tetapi, jika Anda ingin menyimpan banyak dari mereka, Anda bisa menggeser-gesernya dan menyimpan semuanya sebagai satu int, sedikit seperti izin / mode unix file.

Untuk mode 755 misalnya, setiap digit mengacu pada kelas pengguna yang berbeda: pemilik, grup, publik. Dalam setiap digit 4 dibaca, 2 adalah tulis, 1 dijalankan jadi 7 semuanya seperti biner 111. 5 dibaca dan dijalankan 101. Buat skema penyandian Anda sendiri.

Saya hanya menulis sesuatu untuk menyimpan data jadwal TV dari Jadwal Langsung dan saya memiliki bidang biner atau ya / tidak: stereo, hdtv, baru, ei, teks tertutup, dolby, getah dalam bahasa Spanyol, premier musim. Jadi 7 bit, atau integer dengan maksimal 127. Satu karakter banget.

Contoh AC dari apa yang saya kerjakan sekarang. has () adalah fungsi yang mengembalikan 1 jika string ke-2 ada di yang pertama. inp adalah string input untuk fungsi ini. misc adalah karakter unsigned yang diinisialisasi ke 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;

Jadi saya menyimpan 7 boolean dalam satu bilangan bulat dengan ruang lebih banyak.

Alan Corey
sumber
Jawaban ini sangat menghangatkan hati dalam perspektif CS. :)
varun
2

Anda dapat menyederhanakan persamaan di atas menggunakan yang berikut:

boolean flag = sqlInt != 0;

Jika representasi int (sqlInt) dari boolean adalah 0 (false), boolean (flag) akan salah, jika tidak maka akan benar.

Kode ringkas selalu lebih baik untuk digunakan :)

Androider Lapar
sumber
-4

Cara lain untuk melakukannya adalah kolom TEXT. Dan kemudian mengonversi nilai boolean antara Boolean dan String sebelum / sesudah menyimpan / membaca nilai dari database.

Ex. Kamu memiliki "boolValue = true;"

Ke String:

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

Dan kembali ke boolean:

//convert the string back to boolean
bool Boolvalue = Convert.ToBoolean(StringValue);
Niels Schmidt
sumber
6
@Craig McMahon menyarankan untuk menggunakan Integer sebagai gantinya: bilangan prima merepresentasikan true, non-primes mewakili false
Berik
18
Saya merasa sangat ofensif, @Berik. Solusi yang jelas adalah dengan merender kata "BENAR" atau "SALAH" pada gambar dan kemudian menyimpannya di baris basis data sebagai BLOB-encoded BLOB. Orang kemudian dapat membaca nilai kembali menggunakan algoritma ekstraksi fitur sederhana.
Craig McMahon