SQLite中是否有布尔文字?
我知道SQLite中是否有布尔文字?,sqlite,boolean,literals,Sqlite,Boolean,Literals,我知道boolean列类型,但是SQLite中是否有booleanliteral?在其他语言中,这可能是true或false。显然,我可以使用0和1,但我倾向于尽可能避免使用所谓的“幻数” 从中可以看出,它可能存在于其他SQL实现中,但不存在于SQLite中。(我正在使用SQLite 3.6.10,不管它值多少钱。) 1.1布尔数据类型 SQLite没有单独的布尔存储类。相反,布尔值存储为整数0(false)和1(true) 来自文档部分: SQLite没有单独的布尔存储类。相反,布尔值存储为整
boolean
列类型,但是SQLite中是否有boolean
literal?在其他语言中,这可能是true
或false
。显然,我可以使用0
和1
,但我倾向于尽可能避免使用所谓的“幻数”
从中可以看出,它可能存在于其他SQL实现中,但不存在于SQLite中。(我正在使用SQLite 3.6.10,不管它值多少钱。)
1.1布尔数据类型
SQLite没有单独的布尔存储类。相反,布尔值存储为整数0(false)和1(true)
来自文档部分:
SQLite没有单独的布尔存储类。相反,布尔值存储为整数0(false)和1(true)
因此,您似乎被
0
和1
卡住了,因为没有布尔数据类型。仅列出了5种类型。整数可以以不同的宽度存储在磁盘上,最小宽度为1字节。但是,这是一个实施细节:
“但是一旦整数值
读取磁盘并将其存储到内存中
处理时,它们将转换为
最通用的数据类型(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字节。这还不错。
官方文档链接:-布尔->数字(关联)
列关联性
SQLite支持列的类型关联概念。任何列仍然可以存储任何类型的数据,但列的首选存储类称为其关联。SQLite3数据库中的每个表列都分配了以下类型关联之一:
亲缘关系描述
- TEXT此列使用存储类NULL、TEXT或NULL存储所有数据 斑点
- 数值此列可能包含使用所有五种存储的值 上课
- 整数的行为与具有数值关联的列相同 在强制转换表达式中出现异常
- 实数的行为类似于具有数值相关性的列,只是它强制将整数值转换为浮点表示
- 无具有亲缘关系的列无不喜欢一个存储类而不喜欢另一个存储类,并且未尝试 将数据从一个存储类强制转换到另一个存储类
另一方面,尽管SQLite不是这五种类型中的一种,但它支持日期时间,所以这个答案是不确定的
SQLite没有专门用于存储日期和/或时间的存储类。相反,SQLite的内置日期和时间函数能够将日期和时间存储为文本、实数、或整型值:我注意到在SQLite for android中,我可以声明一个布尔列类型,没有错误r和它似乎工作得很好。我还尝试将列定义为“int”并存储java布尔值。我下载了db并确认我在列中写的是“true”。我认为它很有效。问题显然不是列类型(即存储方面),而是
true
和FALSE
文本的使用(即解析器方面的),它们与SQL兼容(参考表中碰巧还包括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
SQLite没有布尔类型,您应该使用整数,0为false,1为true SQLite中是否有布尔文字 如中所述,SQLite没有布尔值的特定数据类型。但从它开始,它支持真/假文本:
创建表时,可以使用
布尔值:
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时,我们可以使用数据类型布尔值而不会出现任何问题SQLite具有TRUE和FALSE文本,如下所示:
(是的,需要很长时间才能回答:)正如其他人所指出的,SQLite不支持特定的布尔存储类型,OP明确承认这一事实。然而,这完全独立于SQLite是否支持布尔文本和理解
对于任何想知道的人来说,答案是是,因为SQLite 3.23可以使用布尔文本TRUE
和FALSE
进行布尔理解,它将按照您的预期工作
例如,您可以执行以下操作:
从某些列为FALSE的blah中选择*;
从某些列为真的废话中选择*;
如果您使用
sqlite> INSERT INTO test(mybool) VALUES (TRUE);
Error: no such column: TRUE