在SQLite中存储布尔值

Ily*_*ski 258 sqlite

SQLite中BOOL值的类型是什么?我想在我的表中存储TRUE/FALSE值.

我可以创建一个INTEGER列并在其中存储值0或1,但它不是实现BOOL类型的最佳方法.

有办法吗?

谢谢.

ang*_*son 342

SQLite没有本机布尔数据类型.根据数据类型文档:

SQLite没有单独的布尔存储类.相反,布尔值存储为整数0(假)和1(真).

  • "INTEGER.该值是有符号整数,存储为1,2,3,4,6或8个字节,具体取决于值的大小." 我想使用1个字节来存储BOOL也不算太糟糕. (22认同)
  • @MuhammadBabar 0/1最绝对.字符串较慢并占用更多空间. (8认同)
  • 哪个在性能方面更好!true/false为字符串还是0/1整数? (3认同)
  • @joce 实际上,整数 0 和 1(以及 NULL)直接在行数据类型声明中编码。所以每个布尔值是零字节,如果你只计算实际的数据存储,这太棒了。但是,如果您计算文件格式所需的每列每行簿记,*所有* 数据类型都需要一个额外的字节,这并不好。:)(参考:https://www.sqlite.org/fileformat.html#record_format) (2认同)

Muh*_*rif 83

SQLite 布尔数据类型:
SQLite没有单独的布尔存储类.相反,布尔值存储为整数0(假)和1(真).

您可以通过以下方式将boolean转换为int:

int flag = (boolValue)? 1 : 0;
Run Code Online (Sandbox Code Playgroud)

您可以将int转换回boolean,如下所示:

 // 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;
Run Code Online (Sandbox Code Playgroud)

如果你想探索sqlite,这是一个教程.
在这里给出了一个答案.这对他们有用.

  • 我建议`Boolean flag2 =(intValue!= 0);` (15认同)
  • 最后一行代码可以是"Boolean flag2 =(intValue == 1)" (13认同)

eri*_*cwa 81

在SQLite中,您可以做的最好是使用整数0和1来表示false和true.您可以像这样声明列类型:

CREATE TABLE foo(mycolumn BOOLEAN NOT NULL CHECK (mycolumn IN (0,1)));
Run Code Online (Sandbox Code Playgroud)

除了0和1之外,省略NOT NULLif NULL.

这里使用类型名称BOOLEAN是为了便于阅读,而SQLite只是一种具有NUMERIC亲和力的类型.

请注意,自SQLite 3.3.0(2006)以来,支持CHECK约束.

以下是一些可行的示例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
Run Code Online (Sandbox Code Playgroud)

还有一些会失败:

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
Run Code Online (Sandbox Code Playgroud)

  • 一个小小的补充。在 ver.3.28.0 中,不带引号的 true/false 插入将成功执行:INSERT INTO foo VALUES(true); 插入 foo 值(假);不带引号的 true/false 也可以在 CHECK 和 DEFAULT 中使用 (2认同)

小智 7

使用值为0和1的Integer数据类型是最快的.


小智 5

进一步了解ericwa的回答。CHECK 约束可以通过强制 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
Run Code Online (Sandbox Code Playgroud)


Ala*_*rey 5

但是,如果要存储一堆,可以对它们进行位移位并将它们全部存储为一个int,有点像unix文件的权限/模式。

例如,对于模式755,每个数字表示不同类别的用户:所有者,组,公共。在每个数字中读取4个数据,写入2个数据,执行1个数据,以便7都像二进制111一样。读取和执行5个数据,所以101。构成您自己的编码方案。

我正在写一些东西来存储Schedules Direct中的电视时间表数据,并且我具有二进制或是/否字段:立体声,hdtv,new,ei,隐藏字幕,杜比,汁液在西班牙语中,本季首播。所以是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;
Run Code Online (Sandbox Code Playgroud)

因此,我将7个布尔值存储在一个整数中,并且还有更多空间。