Есть ли в SQLite логический литерал?

Я знаю о типе столбца boolean, но есть ли в SQLite литерал boolean? На других языках это может быть true или false. Очевидно, что я могу использовать 0 и 1, но я стараюсь избегать так называемых "магических чисел", где это возможно.

Из этот список, похоже, он может существовать в других реализациях SQL, но не SQLite. (Я использую SQLite 3.6.10, для чего это стоит.)

Ответ 1

Из раздела 1.1 Булевский тип данных в документах:

SQLite не имеет отдельного булевского класса хранения. Вместо этого булевые значения сохраняются как целые числа 0 (ложь) и 1 (истина).

Итак, похоже, что вы застряли с 0 и 1.

Ответ 2

  Есть ли логический литерал в SQLite?

Как указано в ответе Джастина Этьера, SQLite не имеет определенного типа данных для логического значения. Но начиная с SQLite 3.23.0 он поддерживает литералы true/false:

  1. Распознайте TRUE и FALSE как константы. (Для совместимости, если существуют столбцы с именами "true" или "false", идентификаторы ссылаются на столбцы, а не на логические константы.)

  2. Операторы поддержки - ИСТИНА, ЛОЖЬ, НЕ ИСТИНА и НЕ ЛОЖЬ.

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

Ответ 3

1.1 Булевский тип данных

SQLite не имеет отдельного булевского класса хранения. Вместо этого булевые значения сохраняются как целые числа 0 (ложь) и 1 (истина).

Документы

Ответ 4

Вопрос явно не в типе столбца (т.е. в отношении хранилища), а в использовании литералов 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

Нет логического типа данных. Существует только 5 типов, перечисленных здесь. Целые числа могут храниться с различной шириной на диске, причем наименьшее значение составляет 1 байт. Однако это подробная информация о реализации:

"Но как только значения INTEGER чтение диска и в память для обработки, они преобразуются в самый общий тип данных (8-байтовый подписчик целое число)".

Учитывая, что неудивительно, что булевых литералов нет.

Ответ 6

Вы можете использовать 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

Ответ 7

В 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

Ответ 8

Я заметил в sqlite для android, я могу объявить тип типа Boolean без ошибок и, похоже, работает нормально. Я также попытался определить столбец как "int" и сохранить значения java boolean. Я загрузил db и подтвердил, что пишу "true" в столбце. Я думаю, что это просто работает.

Ответ 9

SQLite не имеет логического типа, вы должны использовать INTEGER с 0 - false, а 1 - true

Ответ 10

BOOLEAN → NUMERIC (Affinity)

Аффинность столбцов

SQLite поддерживает концепцию сродства типа к столбцам. Любой столбец может хранить данные любого типа, но предпочтительный класс хранения для столбца называется его сродством. Каждому столбцу таблицы в базе данных SQLite3 присваивается одно из следующих аффинностей типа: Описание Affinity

  • TEXT В этом столбце хранятся все данные с использованием классов хранения NULL, TEXT или BLOB.
  • NUMERIC Этот столбец может содержать значения, используя все пять хранилищ классы.
  • INTEGER Ведет себя так же, как столбец с NUMERIC affinity с исключением в выражении CAST.
  • REAL Работает как столбец с NUMERIC сродством, за исключением того, что он приводит целые значения в представление с плавающей запятой
  • NONE Столбец с аффинностью NONE не предпочитает один класс хранения над другим, и никакая попытка не делается для объединить данные из одного класса хранения в другой.

Булев Тип данных:

SQLite не имеет отдельного булевского класса хранения. Вместо этого булевые значения сохраняются как целые числа 0 (ложь) и 1 (истина).

@moiing-утка "С другой стороны, SQLite поддерживает даты, несмотря на то, что не является одним из этих пяти типов, поэтому этот ответ неубедителен"

SQLite не имеет класса хранения, зарезервированного для хранения дат и/или времени.. Вместо этого встроенные функции даты и времени SQLite способны хранить даты и время как TEXT, REAL, или INTEGER: