SQLite 中是不是有布尔文字?

Posted

技术标签:

【中文标题】SQLite 中是不是有布尔文字?【英文标题】:Is there a boolean literal in SQLite?SQLite 中是否有布尔文字? 【发布时间】:2010-03-24 19:06:12 【问题描述】:

我知道boolean 列类型,但是SQLite 中有boolean literal 吗?在其他语言中,这可能是truefalse。显然,我可以使用01,但我倾向于尽可能避免所谓的“幻数”。

来自this list,似乎它可能存在于其他 SQL 实现中,但不存在于 SQLite 中。 (我正在使用 SQLite 3.6.10,物有所值。)

【问题讨论】:

布尔文字!=布尔数据类型。 IMO 不应将其作为重复项关闭。 【参考方案1】:

来自文档的1.1 Boolean Datatype 部分:

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

所以看起来你被 01 困住了。

【讨论】:

我来到这里阅读了文档的确切部分后,恕我直言,对于 01 是否以某种方式与标识符 @ 别名是非常模棱两可的987654328@ 和 true,分别由 SQLite 的 SQL 解析器提供。 遗憾的是这个答案没有回答这个问题,这不是关于存储类/*列类型*而是使用TRUEFALSE文字 ,符合 SQL 标准的 per the Postgresql doc。 抱歉,我的意思是 ANSI SQL 兼容,但无法足够快地找到明确的参考资料,因此退回到 PostgreSQL 文档中的注释。我的评论开始变得像一个答案,所以我缩短了时间,转而写一篇完整的文章,可以有效地回答实际问题。 @Lloeki - SQLite 在布尔值方面不符合 ANSI SQL - 他们的文档是权威来源。按照这些思路,您指向 SQLite 关键字列表的链接非常有用,可以清楚地表明不支持 TRUEFALSE @Lloeki SQLite 现在支持文字 :) 请检查***.com/a/54223589/5070879【参考方案2】:

SQLite 中有布尔字面量吗?

如Justin Ethier's answer 中所述,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

dbfiddle.com demo

【讨论】:

【参考方案3】:

1.1 布尔数据类型

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

Docs

【讨论】:

我来到这里阅读了文档的确切部分,恕我直言,对于 01 是否以某种方式与标识符 @ 987654324@ 和 true,分别由 SQLite 的 SQL 解析器提供。 是的,根据对这个问题的回答,我是这么认为的,但是文档中引用的部分对该 IMO 非常不清楚。它说布尔值分别存储为数字01 - 然后表明这些数字匹配falsetrue .那里的 falsetrue 是什么?给读者的自然语言提示,还是 SQLite 的 SQL 解析器理解的常量/别名?正如我所说,它的编写方式非常模棱两可。 不这么说。它也可以是 SQLite 的 SQL 解析器理解的 false 值,只是不清楚。这就是为什么阅读文档的那部分让我完全一无所知,并寻找一些额外的确认,即在 SQLite 中没有这样的常量 falsetrue,这就是我到达这里的原因。 一些 C 编译器可能会引入伪布尔常量,就像一些 SQL 解析器可能会引入伪布尔常量一样。 @Andrey C 可能没有明确的布尔类型,但它有布尔类型(即,无论您在 if 条件中放置什么,无论是比较、整数还是函数调用的结果,都被视为一个布尔值,因为它只能具有两种效果之一),因此具有 true 和 false 的别名是有意义的。同样的道理,SQLite 没有布尔类型,但它也有布尔类型,所以语言设计者在那里定义别名也是有意义的。 “自己定义常量与在语言中定义常量不同”是的,但有标准库定义。【参考方案4】:

问题显然不是关于列类型(即存储方面),而是TRUEFALSE 文字(即解析器方面)的使用,它们符合SQL per the PostgreSQL keywords documentation(恰好还包括参考表中的 SQL-92、SQL:2008 和 SQL:2011 列)。

SQLite 文档列出了all supported keywords,而这个列表既不包含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 客户端库有时会抑制此错误 (WTF),但正如您所展示的,如果您在命令行 sqlite3 应用程序中运行它,它不喜欢“真”或“假”文字。【参考方案5】:

正如其他人所指出的,SQLite 不支持特定的布尔 storage 类型,并且 OP 特别承认这一事实。但是,这与 SQLite 是否支持布尔 文字和推导完全无关。

对于任何想知道的人,答案是YES,从 SQLite 3.23 开始,您可以使用布尔文字 TRUEFALSE 进行布尔推导,它会按照您的预期工作。

例如,你可以这样做:

SELECT * FROM blah WHERE some_column IS FALSE;

SELECT * FROM blah WHERE some_column IS TRUE;

如果您使用0 表示假,使用1 表示真,它将按照您的预期工作。

根据我的测试,以下是 SQLite 匹配各种值的方式:

任何非零数字、整数或实数:IS TRUE 任何零数字、整数或实数:IS FALSE 空值:IS NULL。与 IS TRUEIS FALSE 不匹配。 任何不解析为数值的文本:IS FALSE。甚至像“t”、“TRUE”、“true”、“True”这样的值仍然匹配IS FALSE 看起来像数字的文本(例如“0”、“1”、“5”):行为类似于上面列出的 NUMERIC。 BLOB:未经测试。

【讨论】:

【参考方案6】:

没有布尔数据类型。只有5种类型,列出here。整数可以以各种宽度存储在磁盘上,最小的为 1 字节。但是,这是一个实现细节:

“但只要 INTEGER 值 从磁盘读入内存 处理,它们被转换为 最通用的数据类型(8 字节有符号 整数)。”

鉴于此,没有布尔文字也就不足为奇了。

【讨论】:

另一方面,SQLite 支持日期时间,尽管它不是这五种类型之一,所以这个答案是不确定的。 sqlite.org/datatype3.html#datetime【参考方案7】:

创建表时可以使用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】:

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

【讨论】:

另一方面,SQLite 支持日期时间,尽管它不是这五种类型之一,所以这个答案是不确定的。 sqlite.org/datatype3.html#datetime【参考方案9】:

我注意到在 android 的 sqlite 中,我可以声明一个没有错误的布尔列类型,并且它似乎工作正常。我还尝试将列定义为“int”并存储 java 布尔值。我下载了数据库并确认我在专栏中写的是“true”。我认为它只是工作。

【讨论】:

CREATE TABLE a (b BOOLEAN DEFAULT(TRUE)); 失败,因为它不理解 TRUE @MooingDuck 现在你可以***.com/a/54223589/5070879 :)【参考方案10】:

SQLite 有 TRUE 和 FALSE 文字,如下所示:

https://www.sqlite.org/syntax/literal-value.html

(是的,很久才回复:)

【讨论】:

【参考方案11】:

SQLite 没有布尔类型,你应该使用 INTEGER,0 为假,1 为真

【讨论】:

【参考方案12】:

BOOLEAN -> NUMERIC(亲和性)

列关联性

SQLite 支持列上类型关联的概念。任何列仍然可以存储任何类型的数据,但列的首选存储类称为它的亲和性。 SQLite3 数据库中的每个表列都分配有以下类型关联之一: 亲和性描述

TEXT 此列使用存储类 NULL、TEXT 或 斑点。 NUMERIC 此列可能包含使用所有五个存储的值 类。 INTEGER 的行为与具有 NUMERIC 亲和性的列相同 在 CAST 表达式中有一个例外。 REAL 行为类似于具有 NUMERIC 亲和性的列,只是它将整数值强制转换为浮点表示 NONE 具有关联性 NONE 的列不首选一个存储类而不是另一个存储类,并且没有尝试 将数据从一个存储类强制转换为另一个。

布尔数据类型:

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

@moiing-duck “另一方面,SQLite 支持日期时间,尽管它不是这五种类型之一,所以这个答案是不确定的”

SQLite 没有专门用于存储日期和/或时间的存储类。 相反,SQLite 的内置日期和时间函数能够将日期和时间存储为 TEXT、REAL、INTEGER 值:

【讨论】:

另一方面,SQLite 支持日期时间,尽管它不是这五种类型之一,所以这个答案是不确定的。 sqlite.org/datatype3.html#datetime 嗯,这太激进了。既然您完全误解了我的观点,我会澄清一下:OP 没有询问 sqlite 是否具有布尔列亲和力。 OP 询问 Sqlite 是否理解“真”和“假”。 sqlite 内置了日期和时间函数的事实证明,关注亲和力与问题无关。如果他问 sqlite 是否支持日期和时间,答案是肯定的。

以上是关于SQLite 中是不是有布尔文字?的主要内容,如果未能解决你的问题,请参考以下文章

如何在SQLite中存储布尔值

在 SQLite 中保存布尔值

SQLite插入布尔值

在sqlite android中存储布尔值

Rails 3 SQLite3 布尔值 false

如何从光标中获取布尔值(Java SQLite)