SQLite中有一个布尔文字吗?

时间:2010-03-24 19:06:13

标签: sqlite boolean literals

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

this list开始,它似乎可能存在于其他SQL实现中,但不存在于SQLite中。 (我正在使用SQLite 3.6.10,它的价值。)

12 个答案:

答案 0 :(得分:75)

来自文档的1.1 Boolean Datatype部分:

  

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

因此,您似乎陷入01

答案 1 :(得分:8)

  

1.1布尔数据类型

     

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

Docs

答案 2 :(得分:7)

  

SQLite中是否有布尔文字?

Justin Ethier's answer中所述,SQLite没有特定的布尔数据类型。但是从SQLite 3.23.0开始,它支持true / false文字:

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

  2.   
  3. 支持运算符为TRUE,FALSE,NOT TRUE和FALSE。

  4.   
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

dbfiddle.com demo

答案 3 :(得分:6)

问题明确不是关于列类型(即存储方式),而是使用TRUEFALSE文字(即解析器),这是符合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可以使用布尔文字TRUEFALSE进行布尔理解,所以它将按您期望的方式工作

例如,您可以执行以下操作:

SELECT * FROM blah WHERE some_column IS FALSE;

SELECT * FROM blah WHERE some_column IS TRUE;

,如果您将0设置为false,将1设置为true,它将起到预期的作用。

根据我的测试,这是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
  • 看起来像数字的TEXT(例如“ 0”,“ 1”,“ 5”):行为类似于上面列出的NUMERIC。
  • BLOB:未经测试。

答案 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)

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

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

(是的,很长的回复时间:)

答案 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数据库中的每个表列都分配了以下类型之一: 亲和力描述

  • TEXT此列使用存储类NULL,TEXT或存储类存储所有数据 BLOB。
  • NUMERIC此列可能包含使用全部五个存储的值 类。
  • INTEGER与具有NUMERIC亲和力的列的行为相同 在CAST表达式中有例外。
  • REAL表现得像具有NUMERIC亲和力的列,除了它将整数值强制为浮点表示
  • NONE具有亲和力NONE的列不喜欢一个存储类而不是另一个存储类,并且不会尝试 将数据从一个存储类强制转换为另一个存储类。

布尔数据类型:

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

  

@ moiing鸭   "另一方面,SQLite支持日期时间,尽管不是这五种类型中的一种,所以这个答案是不确定的"

SQLite没有为存储日期和/或时间而预留存储类。而是,SQLite的内置日期和时间函数能够将日期和时间存储为 TEXT,REAL, INTEGER 值: