我知道boolean
列类型,但是SQLite中有boolean
文字吗?在其他语言中,这可能是true
或false
。显然,我可以使用0
和1
,但是我倾向于尽可能避免使用所谓的“幻数”。
从此列表来看,它似乎可能存在于其他SQL实现中,但不存在于SQLite中。(我正在使用SQLite 3.6.10,这是值得的。)
我知道boolean
列类型,但是SQLite中有boolean
文字吗?在其他语言中,这可能是true
或false
。显然,我可以使用0
和1
,但是我倾向于尽可能避免使用所谓的“幻数”。
从此列表来看,它似乎可能存在于其他SQL实现中,但不存在于SQLite中。(我正在使用SQLite 3.6.10,这是值得的。)
Answers:
0
和1
与标识符莫名其妙别名false
和true
,分别由SQLite的的SQL语法分析程序。
TRUE
,FALSE
不受支持。
SQLite中是否有布尔文字?
如Justin Ethier的回答所述,SQLite没有针对布尔值的特定数据类型。但是从SQLite 3.23.0开始,它支持true / false文字:
将TRUE和FALSE识别为常量。(出于兼容性考虑,如果存在名为“ true”或“ false”的列,则标识符引用这些列而不是布尔常量。)
支持运算符为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
1.1布尔数据类型
SQLite没有单独的布尔存储类。而是将布尔值存储为整数0(假)和1(真)。
0
和1
与标识符莫名其妙别名false
和true
,分别由SQLite的的SQL语法分析程序。
0
和1
,然后表示这些数字匹配false和true。什么是假的和真的吗?向读者提供自然语言的提示,还是SQLite的SQL解析器可以理解的常量/别名?如我所说,它的编写方式非常含糊。
false
SQLite的SQL解析器理解的值,尚不清楚。这就是为什么阅读文档的那部分让我完全一无所知,并寻找一些额外的确认来确认没有这样的常量,false
并且true
在SQLite中,这就是我到达这里的方式。
问题显然不在于列类型(即存储方式),而在于TRUE
和FALSE
文字(即解析器方式)的使用,按照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
sqlite3
应用程序中运行它,它将不喜欢“ true”或“ false”文字。
正如其他所有人所指出的那样,SQLite不支持特定的布尔存储类型,OP特别承认了这一事实。但是,这完全独立于SQLite是否支持布尔文字和推导。
对于任何想知道的人,答案都是肯定的,因为SQLite 3.23可以使用布尔文字TRUE
和进行布尔推导FALSE
,它将按您期望的那样工作。
例如,您可以执行以下操作:
SELECT * FROM blah WHERE some_column IS FALSE;
SELECT * FROM blah WHERE some_column IS TRUE;
如果您使用0
false和1
true ,它将按您期望的那样工作。
根据我的测试,这是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布尔值。我下载了数据库并确认我在该栏中写了“ true”。我认为这行得通。
CREATE TABLE a (b BOOLEAN DEFAULT(TRUE));
失败是因为无法理解TRUE
。
BOOLEAN-> NUMERIC(相似性)
列亲和力
SQLite支持列上的类型相似性的概念。任何列仍然可以存储任何类型的数据,但是列的首选存储类称为亲和力。SQLite3数据库中的每个表列都分配有以下类型关联性之一:亲和力描述
布尔数据类型:
SQLite没有单独的布尔存储类。而是将布尔值存储为整数0(假)和1(真)。
@ moiing-duck “另一方面,SQLite支持日期时间,尽管它不是这五种类型之一,所以此答案尚无定论。”
SQLite没有为存储日期和/或时间预留存储类。相反,SQLite内置的日期和时间功能可以将日期和时间存储为TEXT,REAL或INTEGER值: