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

53

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

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

Теги:
sqlite3
boolean
literals

9 ответов

75
Лучший ответ

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

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

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

  • 9
    Я пришел сюда после прочтения именно той части документации, которая, IMHO, крайне неоднозначна относительно того, связаны ли 0 и 1 с идентификаторами false и true , соответственно, анализатором SQLite SQL.
  • 2
    К сожалению, этот ответ не отвечает на вопрос, который касается не класса хранения / * типа столбца *, а использования литералов TRUE и FALSE , которые совместимы с SQL согласно документу Postgresql .
Показать ещё 5 комментариев
7

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

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

Документы

  • 5
    Я пришел сюда после прочтения именно той части документации, которая, IMHO, крайне неоднозначна относительно того, связаны ли 0 и 1 с идентификаторами false и true , соответственно, анализатором SQLite SQL.
  • 0
    @ORMapper IMO false и true не существует в мире SQLite.
Показать ещё 10 комментариев
6

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

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

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

  1. Признайте ИСТИНА и ЛОЖЬ как константы. (Для совместимости, если существуют столбцы с именами "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

0

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

0

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

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

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

  • 2
    С другой стороны, SQLite поддерживает datetime, несмотря на то, что он не входит в число этих пяти типов, поэтому этот ответ не является окончательным. sqlite.org/datatype3.html#datetime
-1

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

  • 0
    CREATE TABLE a (b BOOLEAN DEFAULT(TRUE)); терпит неудачу, потому что не понимает TRUE .
  • 0
    @MooingDuck Теперь вы можете stackoverflow.com/a/54223589/5070879 :)
-2

В 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

  • 0
    С другой стороны, SQLite поддерживает datetime, несмотря на то, что он не входит в число этих пяти типов, поэтому этот ответ не является окончательным. sqlite.org/datatype3.html#datetime
-3

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:

  • 0
    С другой стороны, SQLite поддерживает datetime, несмотря на то, что он не входит в число этих пяти типов, поэтому этот ответ не является окончательным. sqlite.org/datatype3.html#datetime
  • 3
    Ну, это было агрессивно. Так как вы совершенно не поняли мою точку зрения, я поясню: OP не спрашивает, имеет ли sqlite сходство с булевыми столбцами. ОП спрашивает, понимает ли Sqlite «истина» и «ложь». Тот факт, что sqlite имеет встроенные функции для дат и времени, является доказательством того, что акцент на сродстве не имеет отношения к этому вопросу. Если он спрашивает, поддерживает ли sqlite дату и время, ответ будет положительным.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню