SQLite中是否有布尔文字?


71

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

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


Answers:


92

从文档的1.1布尔数据类型开始

SQLite没有单独的布尔存储类。而是将布尔值存储为整数0(假)和1(真)。

因此,您似乎迷上了0and 1


11
我来到这里后,阅读文档,其中,恕我直言,是关于是否极其暧昧的,准确的位01与标识符莫名其妙别名falsetrue,分别由SQLite的的SQL语法分析程序。
OR Mapper 2014年

5
不幸的是,这个答案并没有回答这个问题,这不是关于存储类/ *列类型*,而是关于TRUEFALSE 文字的使用,根据Postgresql doc,它们和SQL兼容。
Lloeki

1
抱歉,我的意思是符合ANSI SQL的语言,但是找不到足够快的权威参考,因此回过头来看看PostgreSQL文档中的注释。我的评论开始变得像答案一样,所以我缩短了篇幅,转而写了一篇完整的文章,有效地回答了实际问题。
Lloeki '17

1
@Lloeki-关于布尔值,SQLite不兼容ANSI SQL-它们的文档是权威信息。沿着这些思路,您指向SQLite关键字列表的链接非常有用,可以使其清晰明了TRUEFALSE不受支持。
贾斯汀·埃迪尔

3
@Lloeki SQLite现在支持文字:)请检查stackoverflow.com/a/54223589/5070879
Lukasz Szozda

23

SQLite中是否有布尔文字?

Justin Ethier的回答所述,SQLite没有针对布尔值的特定数据类型。但是从SQLite 3.23.0开始,它支持true / false文字:

  1. 将TRUE和FALSE识别为常量。(出于兼容性考虑,如果存在名为“ true”或“ false”的列,则标识符引用这些列而不是布尔常量。)

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

SELECT * FROM a WHERE true;
-- id  b
-- 100 1

dbfiddle.com演示


8

1.1布尔数据类型

SQLite没有单独的布尔存储类。而是将布尔值存储为整数0(假)和1(真)。

文件


6
我来到这里后,阅读文档,其中,恕我直言,是关于是否极其暧昧的,准确的位01与标识符莫名其妙别名falsetrue,分别由SQLite的的SQL语法分析程序。
OR Mapper 2014年

5
是的,根据这个问题的答案,我是这样认为的,但是文档中引用的部分对于该IMO还是非常不清楚的。它说布尔值分别存储为数字01,然后表示这些数字匹配falsetrue。什么是假的真的吗?向读者提供自然语言的提示,还是SQLite的SQL解析器可以理解的常量/别名?如我所说,它的编写方式非常含糊。
OR Mapper 2014年

5
不这么说。它还可能是falseSQLite的SQL解析器理解的值,尚不清楚。这就是为什么阅读文档的那部分让我完全一无所知,并寻找一些额外的确认来确认没有这样的常量,false并且true在SQLite中,这就是我到达这里的方式。
OR Mapper 2014年

3
某些C编译器可能会引入伪布尔常量,就像某些SQL解析器可能会引入伪布尔常量一样。
OR Mapper 2014年

1
@Andrey C可能没有显式的布尔类型,但是它具有布尔值(即,无论您在if条件中是什么,无论是比较,整数还是函数调用的结果,都被视为布尔值,因为它只能有一个的效果),因此别名为true和false是有意义的。同样,SQLite没有布尔类型,但是也有布尔类型,因此对于语言设计人员来说,在其中定义别名也是有意义的。“单独定义常量与在语言中定义常量是不同的事情”是的,但是有标准库定义。
Parthian Shot

8

问题显然不在于列类型(即存储方式),而在于TRUEFALSE文字(即解析器方式)的使用,按照PostgreSQL关键字文档(它也包括SQL-92,SQL ),它们和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客户端库有时会抑制此错误(WTF),但是如您所显示的那样,如果在命令行sqlite3应用程序中运行它,它将不喜欢“ true”或“ false”文字。
Andrew Koster

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;

如果您使用0false和1true ,它将按您期望的那样工作。

根据我的测试,这是SQLite如何匹配各种值的方法:

  • 任何非零的NUMERIC,INTEGER或REAL: IS TRUE
  • 任何零NUMERIC,INTEGER或REAL: IS FALSE
  • 空值:IS NULL。与IS TRUE或不符IS FALSE
  • 任何不解析为数值的TEXT :IS FALSE。即使像“ t”,“ TRUE”,“ true”,“ True”之类的值仍然匹配IS FALSE
  • 看起来像数字的TEXT(例如“ 0”,“ 1”,“ 5”):行为类似于上面列出的NUMERIC。
  • BLOB:未经测试。

0

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

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

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


2
另一方面,SQLite支持日期时间,尽管它不是这五种类型之一,所以此答案尚无定论。sqlite.org/datatype3.html#datetime
Mooing Duck

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



-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


另一方面,SQLite支持日期时间,尽管它不是这五种类型之一,所以此答案尚无定论。sqlite.org/datatype3.html#datetime
Mooing Duck

-1

我在用于Android的sqlite中注意到,我可以声明一个没有错误的布尔列类型,并且它似乎可以正常工作。我也尝试将列定义为'int'并存储java布尔值。我下载了数据库并确认我在该栏中写了“ true”。我认为这行得通。


CREATE TABLE a (b BOOLEAN DEFAULT(TRUE));失败是因为无法理解TRUE
Mooing Duck 2015年

@MooingDuck现在您可以stackoverflow.com/a/54223589/5070879 :)
Lukasz Szozda

-2

SQLite没有布尔类型,您应该使用INTEGER,其中0为false和1为true


-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值:


另一方面,SQLite支持日期时间,尽管它不是这五种类型之一,所以此答案尚无定论。sqlite.org/datatype3.html#datetime
Mooing Duck

3
好吧,那太好斗了。由于您完全误解了我的观点,因此我将澄清:OP不会询问sqlite是否具有布尔列相似性。OP正在询问Sqlite是否理解'true'和'false'。sqlite内置了日期和时间功能的事实证明,关注亲和力与该问题无关。如果他问sqlite是否支持日期和时间,答案将是。
Mooing Duck 2015年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.