76

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

这个列表中,似乎它可能存在于其他 SQL 实现中,但不存在于 SQLite 中。(我正在使用 SQLite 3.6.10,值得。)

4

12 回答 12

97

从文档的第1.1 节布尔数据类型:

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

所以看起来你被困住了0and 1

于 2010-03-24T19:08:52.970 回答
26

SQLite 中是否有布尔文字?

正如Justin Ethier 的回答中所述,SQLite 没有特定的布尔数据类型。但从SQLite 3.23.0开始,它支持真/假文字:

  1. 将 TRUE 和 FALSE 识别为常数。(为了兼容性,如果存在名为“true”或“false”的列,则标识符指的是列而不是布尔常量。)

  2. 支持运算符 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 演示

于 2019-01-16T18:58:12.083 回答
8

1.1 布尔数据类型

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

文档

于 2010-03-24T19:07:51.647 回答
8

问题显然不是关于列类型(即存储方面),而是使用TRUEFALSE文字(即解析器方面),根据 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
于 2017-03-01T16:27:07.660 回答
3

正如其他人所指出的,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 匹配各种值的方式:

  • 任何非零的 NUMERIC、INTEGER 或 REAL:IS TRUE
  • 任何零 NUMERIC、INTEGER 或 REAL:IS FALSE
  • 一个空值:IS NULL。不匹配IS TRUEIS FALSE
  • 任何不解析为数值的 TEXT IS FALSE:. 即使像“t”、“TRUE”、“true”、“True”这样的值仍然匹配IS FALSE
  • 看起来像数字的文本(例如“0”、“1”、“5”):行为类似于上面列出的 NUMERIC。
  • BLOB:未经测试。
于 2020-11-10T06:43:55.890 回答
0

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

“但一旦 INTEGER 值从磁盘读取并进入内存进行处理,它们就会转换为最通用的数据类型(8 字节有符号整数)。”

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

于 2010-03-24T19:09:06.660 回答
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

于 2019-09-10T12:44:26.140 回答
-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

于 2014-12-17T06:59:57.657 回答
-1

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

于 2015-06-24T19:48:03.997 回答
-1

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

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

(是的,很久才回复:)

于 2019-10-30T14:20:30.510 回答
-2

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

于 2017-10-08T14:09:29.053 回答
-3

BOOLEAN -> NUMERIC(亲和性)

列亲和力

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

  • TEXT 此列使用存储类 NULL、TEXT 或 BLOB 存储所有数据。
  • NUMERIC 此列可能包含使用所有五个存储类的值。
  • INTEGER 与具有 NUMERIC 关联的列的行为相同,但在 CAST 表达式中存在异常。
  • REAL 行为类似于具有 NUMERIC 亲和性的列,不同之处在于它将整数值强制转换为浮点表示
  • NONE 具有关联性 NONE 的列不会优先选择一个存储类而不是另一个存储类,并且不会尝试将数据从一个存储类强制转换到另一个存储类。

布尔数据类型:

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

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

SQLite 没有为存储日期和/或时间预留存储类。相反,SQLite 的内置日期和时间函数能够将日期和时间存储为TEXT、REALINTEGER值:

于 2015-04-22T01:22:31.367 回答