在SQLite中存储布尔值

时间:2009-05-09 18:13:12

标签: sqlite

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

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

有办法吗?

感谢。

10 个答案:

答案 0 :(得分:325)

SQLite没有本机布尔数据类型。根据{{​​3}}:

  

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

答案 1 :(得分:82)

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

你可以用这种方式将boolean转换为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,here is a tutorial 我给出了一个答案here。这对他们有用。

答案 2 :(得分:71)

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

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

除了0和1之外,如果你想允许NOT NULL,请省略NULL

此处使用类型名称BOOLEAN是为了便于阅读,而SQLite只是一种类型with NUMERIC affinity

请注意,自CHECK constraints(2006)以来{}已支持SQLite 3.3.0

以下是一些可行的示例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

答案 3 :(得分:7)

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

答案 4 :(得分:5)

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

例如,对于模式755,每个数字指的是不同类别的用户:所有者,组,公共。在每个数字4中读取,2是写入,1是执行,因此7都是二进制111. 5被读取并执行所以101.组成自己的编码方案。

我只是写一些用于存储来自Schedules Direct的电视节目表数据的东西,我有二进制或是/否字段:立体声,hdtv,新的,ei,关闭字幕,杜比,西班牙语的sap,季节首映。所以7位,或者一个最大值为127的整数。真的是一个字符。

我现在正在做的一个C例子。 has()是一个函数,如果第二个字符串在第一个字符串中,则返回1。 inp是此函数的输入字符串。 misc是一个初始化为0的unsigned char。

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个布尔值存储在一个整数中,并且有更多空间。

答案 5 :(得分:4)

继续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

答案 6 :(得分:1)

您可以使用以下内容简化上述等式:

boolean flag = sqlInt != 0;

如果布尔值的int表示(sqlInt)为0(false),则boolean(flag)为false,否则为true。

简洁代码总是更好用于:)

答案 7 :(得分:-1)

UPDATE表SET Boolcolumn ='1'WHERE ......

答案 8 :(得分:-1)

带有 SQLAlchemy 的 Flask 具有布尔值。

https://overiq.com/flask-101/database-modelling-in-flask/

答案 9 :(得分:-3)

另一种方法是使用TEXT列。然后在保存/读取数据库中的值之前/之后转换布尔值和字符串之间的布尔值。

实施例。你有"boolValue = true;

To String:

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

回到布尔:

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