在SQLite中存储布尔值

在SQLite中存储布尔值,sqlite,Sqlite,SQLite中BOOL值的类型是什么?我想在我的表中存储真/假值 我可以创建一列INTEGER并在其中存储值0或1,但这不是实现BOOL类型的最佳方法 有办法吗?SQLite没有本机布尔数据类型。根据: SQLite没有单独的布尔存储类。相反,布尔值存储为整数0(false)和1(true) SQLite SQLite没有单独的布尔存储类。相反,布尔值存储为整数0(false)和1(true)。 可以通过以下方式将布尔值转换为int: int flag = (boolValue)? 1 : 0;

SQLite中BOOL值的类型是什么?我想在我的表中存储真/假值

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


有办法吗?

SQLite没有本机布尔数据类型。根据:

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

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

可以通过以下方式将布尔值转换为int:

int flag = (boolValue)? 1 : 0;
您可以按如下方式将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;
如果您想探索sqlite,。

我已经给出了一个答案。它对他们有效。

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

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

例如,您有
“布尔值=true;

要设置字符串,请执行以下操作:

//convert to the string "TRUE"
string StringValue = boolValue.ToString;  
然后返回布尔值:

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

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

CREATE TABLE foo(mycolumn BOOLEAN NOT NULL CHECK (mycolumn IN (0, 1)));
如果要在0和1之外允许
NULL
,请省略
notnull

这里使用类型名
BOOLEAN
是为了可读性,对于SQLite来说,它只是一个类型

请注意,自(2006年)以来一直支持这一方案

下面是一些有用的插入示例:(注意字符串和浮点数是如何解析为整数的)

还有一些会失败:

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

您可以使用以下公式简化上述方程式:

boolean flag = sqlInt != 0;
如果布尔值的int表示(sqlInt)为0(false),则布尔值(标志)将为false,否则为true


简洁的代码总是更好地使用:)

进一步了解ericwa的答案。CHECK约束可以通过强制文本数据类型启用伪布尔列,并且只允许特定于大小写的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被读取并执行so 101。制定自己的编码方案

我正在写一些东西来存储Schedules Direct中的电视节目表数据,我有二进制或是/否字段:stereo、hdtv、new、ei、闭路字幕、dolby、西班牙语sap、season premiere。所以是7位,或者一个最大值为127的整数。真的是一个角色

我现在正在研究的一个C示例。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;

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

使用SQLAlchemy的Flask具有布尔值


“整数。该值是一个有符号整数,根据值的大小存储在1、2、3、4、6或8个字节中。”我想使用1个字节存储布尔值并不太糟糕。这在性能方面更好!字符串或0/1整数的真/假?@MuhammadBabar 0/1最肯定。字符串速度较慢,占用更多空间。@实际上,整数0和1(以及NULL)直接在行数据类型声明中编码。如果你只计算实际的数据存储,那么每个布尔值是零字节,这太棒了。但是,如果按文件格式要求按列按行记账,则所有数据类型都需要额外的字节,这并不可怕。:)(参考:)@Davor关于char(1)的情况如何,这是否比int更糟糕?代码的最后一行可能只是“Boolean flag2=(intValue==1)”我建议
Boolean flag2=(intValue!=0)或者只需执行布尔标记2=(intValue>0)@Craig McMahon建议改为使用整数:素数代表真,非素数代表假。我觉得这非常令人反感,@Berik。显而易见的解决方案是将单词“TRUE”或“FALSE”呈现到图像上,然后将其作为JPEG编码的BLOB保存在数据库行中。然后,人们可以使用一个简单的特征提取算法来读取值。从CS的角度来看,这个答案是如此的温暖人心警告-如果在某些机器上设置了
默认值
,则必须将其设置为
默认值0
默认值1
,而不是
。显然,Linux的一些版本不喜欢这样,尽管它在Groovy上运行得很好。在3.28.0版中,将成功执行不带引号的真/假插入:插入到foo值中(真);插入到foo值中(false);尽管SQLite不支持布尔数据类型,但在CHECK和default中也可以使用不带引号的true/false
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;