我知道boolean
列类型,但SQLite中是否有boolean
文字?在其他语言中,这可能是true
或false
。显然,我可以使用0
和1
,但我倾向于尽可能避免使用所谓的“魔数”。
从this list开始,它似乎可能存在于其他SQL实现中,但不存在于SQLite中。 (我正在使用SQLite 3.6.10,它的价值。)
答案 0 :(得分:75)
答案 1 :(得分:8)
1.1布尔数据类型
SQLite没有单独的布尔存储类。相反,布尔值存储为整数0(假)和1(真)。
答案 2 :(得分:7)
SQLite中是否有布尔文字?
如Justin Ethier's answer中所述,SQLite没有特定的布尔数据类型。但是从SQLite 3.23.0开始,它支持true / false文字:
将TRUE和FALSE识别为常量。(出于兼容性考虑,如果存在名为“ true”或“ false”的列,则标识符引用这些列而不是布尔常量。)
支持运算符为TRUE,FALSE,NOT TRUE和FALSE。
SELECT true AS t, false AS f;
SELECT 'condition is true'
WHERE 1 IS NOT FALSE;
CREATE TABLE a (id INT, b BOOLEAN DEFAULT(TRUE));
INSERT INTO a(id) VALUES(100);
SELECT * FROM a;
-- id b
-- 100 1
答案 3 :(得分:6)
问题明确不是关于列类型(即存储方式),而是使用TRUE
和FALSE
文字(即解析器),这是符合SQL的per the PostgreSQL keywords documentation(在参考表中恰好还包括SQL-92,SQL:2008和SQL:2011列)。
SQLite文档列出了all supported keywords,此列表既不包含TRUE
也不包含FALSE
,因此SQLite在这方面可能不合规。
你也可以轻松地测试它,看看解析器barf如何让令牌成为列名:
$ sqlite3 :memory:
SQLite version 3.14.0 2016-07-26 15:17:14
sqlite> CREATE TABLE foo (booleanish INT);
sqlite> INSERT INTO foo (booleanish) VALUES (TRUE);
Error: no such column: TRUE
答案 4 :(得分:1)
正如其他所有人所指出的那样,SQLite不支持特定的布尔型存储类型,OP明确承认了这一事实。但是,这完全独立于SQLite是否支持布尔文字和理解力。
对于任何想知道的人,答案都是是,因为SQLite 3.23可以使用布尔文字TRUE
和FALSE
进行布尔理解,所以它将按您期望的方式工作
例如,您可以执行以下操作:
SELECT * FROM blah WHERE some_column IS FALSE;
SELECT * FROM blah WHERE some_column IS TRUE;
,如果您将0
设置为false,将1
设置为true,它将起到预期的作用。
根据我的测试,这是SQLite如何匹配各种值的方法:
IS TRUE
IS FALSE
IS NULL
。与IS TRUE
或IS FALSE
不匹配。IS FALSE
。即使像“ t”,“ TRUE”,“ true”,“ True”之类的值仍匹配IS FALSE
答案 5 :(得分:0)
没有布尔数据类型。列出的here只有5种类型。整数可以在磁盘上以各种宽度存储,最小的是1个字节。但是,这是一个实现细节:
“但是只要INTEGER值是 读取磁盘并进入内存 处理,他们被转换为 最常见的数据类型(8字节签名 整数)。“
鉴于此,没有布尔文字就不足为奇了。
答案 6 :(得分:0)
SQLite没有布尔类型,你应该使用INTEGER,0为假,1为真
答案 7 :(得分:0)
创建表时可以使用BOOLEAN
:
sqlite3 :memory:
SQLite version 3.22.0 2018-01-22 18:45:57
Enter ".help" for usage hints.
sqlite> CREATE TABLE test (mybool BOOLEAN);
但这不是真正的数据类型,在表的SQL描述中,我们将具有以下内容:
"mybool" BOOLEAN NOT NULL CHECK(mybool IN(0,1))
基本上,我们创建一个SQL约束,该约束的值应为0或1。因此,使用TRUE / FALSE将弹出错误:
sqlite> INSERT INTO test(mybool) VALUES (TRUE);
Error: no such column: TRUE
因此,我们可以使用关键字BOOLEAN
,但必须使用0/1,因为它不是“真实”数据类型。
在使用sqlalchemy时,我们可以毫无问题地使用数据类型BOOLEAN
答案 8 :(得分:0)
答案 9 :(得分:-1)
SQLite3中只支持5种数据类型。
来自官方SQLite3文档。 “存储在SQLite数据库中(或由数据库引擎操纵)的每个值都具有以下存储类之一:
NULL. The value is a NULL value.
INTEGER. The value is a signed integer, stored in 1, 2, 3, 4, 6, or 8 bytes depending on the magnitude of the value."
如果要存储1和0,那么SQLite将使用1个字节(如果存储)。哪个不错。 官方文档链接: - http://www.sqlite.org/datatype3.html
答案 10 :(得分:-1)
我注意到在sqlite for android中,我可以声明一个没有错误的布尔列类型,它似乎工作正常。我还尝试将列定义为'int'并存储java boolean值。我下载了db并确认我在列中写了“true”。我认为它只是有效。
答案 11 :(得分:-2)
BOOLEAN - > NUMERIC(亲和力)
列亲和力
SQLite支持列上类型亲和性的概念。任何列仍然可以存储任何类型的数据,但列的首选存储类称为其关联。 SQLite3数据库中的每个表列都分配了以下类型之一: 亲和力描述
布尔数据类型:
SQLite没有单独的布尔存储类。相反,布尔值存储为整数0(假)和1(真)。
@ moiing鸭 "另一方面,SQLite支持日期时间,尽管不是这五种类型中的一种,所以这个答案是不确定的"
SQLite没有为存储日期和/或时间而预留存储类。而是,SQLite的内置日期和时间函数能够将日期和时间存储为 TEXT,REAL,或 INTEGER 值: