在SQLite中BOOL值的类型是什么?我想在我的表中存储TRUE/FALSE值。
我可以创建一个INTEGER列,并在其中存储0或1的值,但这不是实现BOOL类型的最佳方式。
有办法吗?
在SQLite中BOOL值的类型是什么?我想在我的表中存储TRUE/FALSE值。
我可以创建一个INTEGER列,并在其中存储0或1的值,但这不是实现BOOL类型的最佳方式。
有办法吗?
当前回答
使用值为0和1的Integer数据类型是最快的。
其他回答
另一种方法是TEXT列。然后在从数据库保存/读取值之前/之后,在布尔值和String值之间转换布尔值。
例如,你有"boolValue = true;"
字符串:
//convert to the string "TRUE"
string StringValue = boolValue.ToString;
回到boolean:
//convert the string back to boolean
bool Boolvalue = Convert.ToBoolean(StringValue);
在SQLite中,你能做的最好的事情就是使用整数0和1来表示假和真。你可以这样声明列类型:
CREATE TABLE foo(mycolumn BOOLEAN NOT NULL CHECK (mycolumn IN (0, 1)));
如果您想允许0和1之外的值为NULL,则省略NOT NULL。
这里使用类型名称BOOLEAN是为了可读性,对于SQLite来说,它只是一个具有数字相关性的类型。
请注意,CHECK约束自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
你可以用下面的方法来简化上面的方程:
boolean flag = sqlInt != 0;
如果布尔值的int表示(sqlInt)为0 (false),则布尔值(flag)为false,否则为true。
简洁的代码总是更好的工作:)
埃里克瓦的回答更进一步。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
使用值为0和1的Integer数据类型是最快的。