我知道boolean
列类型,但在SQLite中是否有boolean
字面值呢?在其他编程语言中,这可能是true
或false
。显然,我可以使用0
和1
,但我倾向于尽可能避免所谓的“魔数”。
从这个列表来看,它似乎存在于其他SQL实现中,但不在SQLite中。(我使用的是SQLite 3.6.10)
0
和1
分别与标识符false
和true
进行了别名处理非常模糊不清。请注意,我的翻译旨在使内容更加通俗易懂,但不改变原始含义。 - O. R. MapperTRUE
和FALSE
文本的使用,这些文本符合SQL标准,根据Postgresql文档(https://www.postgresql.org/docs/8.1/static/datatype-boolean.html)提供。 - LloekiTRUE
和 FALSE
不被支持。 - Justin EthierSELECT 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(真)存储。
false
和true
同义非常含糊不清。 - O. R. Mapper0
和1
的形式存储,然后指出这些数字匹配false和true。那里的false和true是什么?对读者的自然语言提示,还是SQLite的SQL解析器理解的常量/别名?正如我所说,写得非常模糊不清。 - O. R. MapperTRUE
和FALSE
字面值的使用有关(即解析器方面),它们符合SQL标准,如PostgreSQL关键字文档所述(该文档还包括参考表中的SQL-92、SQL:2008和SQL:2011列)。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”文字。 - Andrew Koster在编程中,没有布尔数据类型。只有5种类型,在这里列出。整数可以以不同的宽度存储在磁盘上,最小的宽度为1字节。然而,这是一个实现细节:
"但是,一旦从磁盘读取INTEGER值并进入内存进行处理,它们就会转换为最通用的数据类型(8字节有符号整数)."
考虑到这一点,没有布尔字面量也就不足为奇了。
我注意到在安卓的sqlite中,我可以声明一个布尔列类型而不会出错,并且它似乎工作正常。我还尝试将该列定义为“int”并存储java布尔值。我下载了数据库并确认我正在写入该列的“true”。我认为它只是有效的。
在创建表时,您可以使用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,因为它不是一个“真正”的数据类型。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