我知道boolean
列类型,但是SQLite中有boolean
文字吗?在其他语言中,这可能是true
或false
。显然,我可以使用0
and 1
,但我倾向于尽可能避免所谓的“幻数”。
从这个列表中,似乎它可能存在于其他 SQL 实现中,但不存在于 SQLite 中。(我正在使用 SQLite 3.6.10,值得。)
SQLite 中是否有布尔文字?
正如Justin Ethier 的回答中所述,SQLite 没有特定的布尔数据类型。但从SQLite 3.23.0开始,它支持真/假文字:
将 TRUE 和 FALSE 识别为常数。(为了兼容性,如果存在名为“true”或“false”的列,则标识符指的是列而不是布尔常量。)
支持运算符 IS TRUE、IS FALSE、IS NOT TRUE 和 IS NOT 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
SELECT * FROM a WHERE true;
-- id b
-- 100 1
1.1 布尔数据类型
SQLite 没有单独的布尔存储类。相反,布尔值存储为整数 0(假)和 1(真)。
问题显然不是关于列类型(即存储方面),而是使用TRUE
和FALSE
文字(即解析器方面),根据 PostgreSQL 关键字文档(恰好也包括 SQL-92、SQL :2008 和 SQL:2011 参考表中的列)。
SQLite 文档列出了所有受支持的关键字,并且该列表既不包含TRUE
也不包含FALSE
,因此 SQLite 在这方面很遗憾是不合规的。
您还可以轻松地对其进行测试,并查看解析器如何将令牌作为列名:
$ 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
正如其他人所指出的,SQLite 不支持特定的布尔存储类型,并且 OP 特别承认这一事实。然而,这完全独立于 SQLite 是否支持 boolean literals 和 comprehensions。
对于任何想知道的人来说,答案是肯定TRUE
的,因为 SQLite 3.23 你可以用布尔文字和做布尔理解FALSE
,它会按照你的期望工作。
例如,您可以这样做:
SELECT * FROM blah WHERE some_column IS FALSE;
SELECT * FROM blah WHERE some_column IS TRUE;
0
如果您使用for false 和for true ,它将按照您的预期工作1
。
根据我的测试,以下是 SQLite 匹配各种值的方式:
IS TRUE
IS FALSE
IS NULL
。不匹配IS TRUE
或IS FALSE
。IS FALSE
:. 即使像“t”、“TRUE”、“true”、“True”这样的值仍然匹配IS FALSE
没有布尔数据类型。此处仅列出 5 种类型。整数可以以各种宽度存储在磁盘上,最小的为 1 字节。但是,这是一个实现细节:
“但一旦 INTEGER 值从磁盘读取并进入内存进行处理,它们就会转换为最通用的数据类型(8 字节有符号整数)。”
鉴于此,没有布尔文字也就不足为奇了。
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
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
我注意到在 android 的 sqlite 中,我可以声明一个没有错误的布尔列类型,它似乎工作正常。我还尝试将列定义为“int”并存储 java 布尔值。我下载了数据库并确认我在专栏中写了“真实”。我认为它只是工作。
SQLite 没有布尔类型,你应该使用 INTEGER,0 为假,1 为真
BOOLEAN -> NUMERIC(亲和性)
列亲和力
SQLite 支持列上类型关联的概念。任何列仍然可以存储任何类型的数据,但列的首选存储类称为它的亲和性。SQLite3 数据库中的每个表列都分配有以下类型的关联性之一: 关联性描述
布尔数据类型:
SQLite 没有单独的布尔存储类。相反,布尔值存储为整数 0(假)和 1(真)。
@moiing-duck “另一方面,SQLite 支持日期时间,尽管它不是这五种类型之一,所以这个答案是不确定的”
SQLite 没有为存储日期和/或时间预留存储类。相反,SQLite 的内置日期和时间函数能够将日期和时间存储为TEXT、REAL或INTEGER值: