Есть ли логический литерал в SQLite? - PullRequest
56 голосов
/ 24 марта 2010

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

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

Ответы [ 9 ]

76 голосов
/ 24 марта 2010

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

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

Похоже, вы застряли с 0 и 1.

8 голосов
/ 24 марта 2010

1.1 Логический тип данных

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

Docs

7 голосов
/ 16 января 2019

Есть ли логический литерал в 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

6 голосов
/ 01 марта 2017

Вопрос явно не о типе столбца (т. Е. В хранилище), а об использовании литералов TRUE и FALSE (т. Е. Анализатора), которые совместимы с SQL как 1005 * согласно документации по ключевым словам 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
0 голосов
/ 08 октября 2017

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

0 голосов
/ 24 июня 2015

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

0 голосов
/ 22 апреля 2015

BOOLEAN -> NUMERIC (Affinity)

Колонка Affinity

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

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

Логический тип данных:

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

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

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

0 голосов
/ 17 декабря 2014

В 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

0 голосов
/ 24 марта 2010

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

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

Учитывая это, неудивительно, что нет логических литералов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...