可以将文章内容翻译成中文,广告屏蔽插件可能会导致该功能失效(如失效,请关闭广告屏蔽插件后再试):
问题:
I know about the boolean
column type, but is there a boolean
literal in SQLite? In other languages, this might be true
or false
. Obviously, I can use 0
and 1
, but I tend to avoid so-called "magic numbers" where possible.
From this list, it seems like it might exist in other SQL implementations, but not SQLite. (I'm using SQLite 3.6.10, for what it's worth.)
回答1:
From section 1.1 Boolean Datatype of the docs:
SQLite does not have a separate Boolean storage class. Instead, Boolean values are stored as integers 0 (false) and 1 (true).
So it looks like you are stuck with 0
and 1
.
回答2:
1.1 Boolean Datatype
SQLite does not have a separate Boolean storage class. Instead, Boolean values are stored as integers 0 (false) and 1 (true).
Docs
回答3:
The question is explicitly not about the column type (i.e storage-wise) but the use of TRUE
and FALSE
literals (i.e. parser-wise), which are SQL-compliant as per the PostgreSQL keywords documentation (which happens to also include SQL-92, SQL:2008 and SQL:2011 columns in the reference table).
The SQLite documentation lists all supported keywords, and this list contains neither TRUE
nor FALSE
, hence SQLite sadly is non-compliant in that regard.
You can also test it easily and see how the parser barfs as it wants the token to be a column name:
$ 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:
Is there a boolean literal in SQLite?
As stated in Justin Ethier's answer, SQLite does not have specific data type for boolean. But starting from SQLite 3.23.0 it supports true/false literals:
Recognize TRUE and FALSE as constants. (For compatibility, if there exist columns named "true" or "false", then the identifiers refer to the columns rather than Boolean constants.)
Support operators IS TRUE, IS FALSE, IS NOT TRUE, and IS NOT 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
dbfiddle.com demo
回答5:
There is no boolean data type. There are only 5 types, listed here. Integers can be stored with various widths on disk, the smallest being 1 byte. However, this is an implementation detail:
"But as soon as INTEGER values are
read off of disk and into memory for
processing, they are converted to the
most general datatype (8-byte signed
integer)."
Given that, it is not surprising there are no boolean literals.
回答6:
SQLite doesn't have Boolean type, you should use INTEGER with 0 is false and 1 is true
回答7:
There are only 5 datatypes supported in SQLite3.
From the Official SQLite3 doc.
"Each value stored in an SQLite database (or manipulated by the database engine) has one of the following storage classes:
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."
If you are going to store 1s and 0s, then SQLite wil use 1 byte if storage. Which is not bad.
Official Doc link :- http://www.sqlite.org/datatype3.html
回答8:
I noticed in sqlite for android, I can declare a Boolean column type with no error and its seems to work fine. I also tried defining the column as 'int' and storing java boolean values. I downloaded the db and confirmed I'm writing "true" in the column. I think it just works.
回答9:
BOOLEAN -> NUMERIC (Affinity)
Column Affinity
SQLite supports the concept of type affinity on columns. Any column can still store any type of data but the preferred storage class for a column is called its affinity. Each table column in an SQLite3 database is assigned one of the following type affinities:
Affinity Description
- TEXT This column stores all data using storage classes NULL, TEXT or
BLOB.
- NUMERIC This column may contain values using all five storage
classes.
- INTEGER Behaves the same as a column with NUMERIC affinity
with an exception in a CAST expression.
- REAL Behaves like a column with NUMERIC affinity except that it forces integer values into floating point representation
- NONE A column with affinity NONE does not prefer one storage class over another and no attempt is made to
coerce data from one storage class into another.
Boolean Datatype:
SQLite does not have a separate Boolean storage class. Instead, Boolean values are stored as integers 0 (false) and 1 (true).
@moiing-duck
"On the flip side, SQLite supports datetimes, despite not being one of those five types, so this answer is inconclusive"
SQLite does not have a storage class set aside for storing dates and/or times. Instead, the built-in Date And Time Functions of SQLite are capable of storing dates and times as TEXT, REAL, or INTEGER values: