Ответ 1
Из раздела 1.1 Булевский тип данных в документах:
SQLite не имеет отдельного булевского класса хранения. Вместо этого булевые значения сохраняются как целые числа 0 (ложь) и 1 (истина).
Итак, похоже, что вы застряли с 0
и 1
.
Я знаю о типе столбца boolean
, но есть ли в SQLite литерал boolean
? На других языках это может быть true
или false
. Очевидно, что я могу использовать 0
и 1
, но я стараюсь избегать так называемых "магических чисел", где это возможно.
Из этот список, похоже, он может существовать в других реализациях SQL, но не SQLite. (Я использую SQLite 3.6.10, для чего это стоит.)
Из раздела 1.1 Булевский тип данных в документах:
SQLite не имеет отдельного булевского класса хранения. Вместо этого булевые значения сохраняются как целые числа 0 (ложь) и 1 (истина).
Итак, похоже, что вы застряли с 0
и 1
.
Есть ли логический литерал в SQLite?
Как указано в ответе Джастина Этьера, SQLite не имеет определенного типа данных для логического значения. Но начиная с SQLite 3.23.0 он поддерживает литералы true/false:
Распознайте TRUE и FALSE как константы. (Для совместимости, если существуют столбцы с именами "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
1.1 Булевский тип данных
SQLite не имеет отдельного булевского класса хранения. Вместо этого булевые значения сохраняются как целые числа 0 (ложь) и 1 (истина).
Вопрос явно не в типе столбца (т.е. в отношении хранилища), а в использовании литералов TRUE
и FALSE
(то есть в синтаксическом анализе), которые совместимы с SQL согласно документации по ключевым словам PostgreSQL (которая также включает в себя SQL-92). Столбцы SQL: 2008 и SQL: 2011 в справочной таблице).
В документации SQLite перечислены все поддерживаемые ключевые слова, и этот список не содержит ни TRUE
ни FALSE
, следовательно, SQLite, к сожалению, не соответствует этим требованиям.
Вы также можете легко протестировать его и посмотреть, как парсер barfs хочет, чтобы токен был именем столбца:
$ 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
Нет логического типа данных. Существует только 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 байт, если хранилище. Это неплохо. Официальная ссылка на Doc: - http://www.sqlite.org/datatype3.html
Я заметил в sqlite для android, я могу объявить тип типа Boolean без ошибок и, похоже, работает нормально. Я также попытался определить столбец как "int" и сохранить значения java boolean. Я загрузил db и подтвердил, что пишу "true" в столбце. Я думаю, что это просто работает.
SQLite не имеет логического типа, вы должны использовать INTEGER с 0 - false, а 1 - true
BOOLEAN → NUMERIC (Affinity)
Аффинность столбцов
SQLite поддерживает концепцию сродства типа к столбцам. Любой столбец может хранить данные любого типа, но предпочтительный класс хранения для столбца называется его сродством. Каждому столбцу таблицы в базе данных SQLite3 присваивается одно из следующих аффинностей типа: Описание Affinity
Булев Тип данных:
SQLite не имеет отдельного булевского класса хранения. Вместо этого булевые значения сохраняются как целые числа 0 (ложь) и 1 (истина).
@moiing-утка "С другой стороны, SQLite поддерживает даты, несмотря на то, что не является одним из этих пяти типов, поэтому этот ответ неубедителен"
SQLite не имеет класса хранения, зарезервированного для хранения дат и/или времени.. Вместо этого встроенные функции даты и времени SQLite способны хранить даты и время как TEXT, REAL, или INTEGER: