¿Hay un literal booleano en SQLite?


Yo sé acerca de la boolean tipo de columna, pero hay un boolean literal en SQLite? En otros idiomas, esto podría ser true o false. Obviamente, puedo usar 0 y 1, pero tiendo a evitar los llamados "números mágicos" cuando es posible.

De esta lista, parece que podría existir en otras implementaciones SQL, pero no SQLite. (Estoy usando SQLite 3.6.10, por lo que vale la pena.)

Author: Benjamin Oakes, 2010-03-24

8 answers

De la sección 1.1 Tipo de datos booleano de los documentos:

SQLite no tiene una clase de almacenamiento booleano independiente. En su lugar, los valores booleanos se almacenan como enteros 0 (falso) y 1 (verdadero).

Así que parece que estás atascado con 0 y 1.

 69
Author: Justin Ethier,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-03-24 19:08:52

1.1 Tipo De Datos Booleano

SQLite no tiene una clase de almacenamiento booleano independiente. En su lugar, los valores booleanos se almacenan como enteros 0 (falso) y 1 (verdadero).

Docs

 6
Author: Andrey,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-02-24 15:11:00

La pregunta no es explícitamente sobre el tipo de columna (es decir, en cuanto al almacenamiento), sino sobre el uso de TRUE y FALSE literales (es decir, en cuanto al analizador), que son compatibles con SQL como según la documentación de palabras clave PostgreSQL (que también incluye columnas SQL-92, SQL:2008 y SQL:2011 en la tabla de referencia).

La documentación de SQLite enumera todas las palabras clave soportadas, y esta lista no contiene ni TRUE ni FALSE, por lo que SQLite lamentablemente no cumple con eso respecto.

También puede probarlo fácilmente y ver cómo el analizador barfs, ya que quiere que el token sea un nombre de columna:

$ 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
 6
Author: Lloeki,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-03-03 10:52:27

No hay ningún tipo de datos booleano. Solo hay 5 tipos, enumerados aquí. Los enteros se pueden almacenar con varios anchos en el disco, siendo el más pequeño 1 byte. Sin embargo, este es un detalle de implementación:

" Pero tan pronto como los valores ENTEROS son leer fuera del disco y en la memoria para procesamiento, se convierten a la tipo de datos más general (8 bytes firmados entero)."

Dado eso, no es sorprendente que no haya literales booleanos.

 0
Author: Matthew Flaschen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-03-24 19:09:06

SQLite no tiene tipo booleano, debe usar INTEGER con 0 es false y 1 es true

 0
Author: Tung Nguyen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-10-08 14:09:29

Solo hay 5 tipos de datos soportados en SQLite3.

Del documento Oficial SQLite3. "Cada valor almacenado en una base de datos SQLite (o manipulado por el motor de base de datos) tiene una de las siguientes clases de almacenamiento:

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."

Si va a almacenar 1s y 0s, entonces SQLite usará 1 byte si se almacena. Lo cual no está mal. Enlace oficial del documento: - http://www.sqlite.org/datatype3.html

 -1
Author: Akshay Patil,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-12-17 06:59:57

Me di cuenta en sqlite para Android, puedo declarar un tipo de columna booleana sin error y parece que funciona bien. También intenté definir la columna como ' int ' y almacenar valores booleanos de Java. He descargado la base de datos y confirmado que estoy escribiendo "verdadero" en la columna. Creo que funciona.

 -1
Author: Mike Michaels,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-06-24 19:48:03

BOOLEANO - > NUMÉRICO (Afinidad)

Afinidad de columna

SQLite soporta el concepto de afinidad de tipos en columnas. Cualquier columna todavía puede almacenar cualquier tipo de datos, pero la clase de almacenamiento preferida para una columna se llama su afinidad. A cada columna de tabla en una base de datos SQLite3 se le asigna una de las siguientes afinidades de tipo: Descripción de afinidad

  • TEXT Esta columna almacena todos los datos utilizando clases de almacenamiento NULL, TEXT o BLOB.
  • NUMÉRICO Esta columna puede contener valores utilizando los cinco almacenamiento clase.
  • El ENTERO se comporta igual que una columna con afinidad NUMÉRICA con una excepción en una expresión FUNDIDA.
  • REAL Se comporta como una columna con afinidad numérica, excepto que fuerza los valores enteros en una representación en coma flotante
  • NONE Una columna con afinidad NONE no prefiere una clase de almacenamiento sobre otra y no se intenta coaccionar datos de una clase de almacenamiento en otro.

Tipo de datos booleano:

SQLite no tiene una clase de almacenamiento booleano independiente. En su lugar, los valores booleanos se almacenan como enteros 0 (falso) y 1 (verdadero).

@moiing-duck "Por otro lado, SQLite admite datetimes, a pesar de no ser uno de esos cinco tipos, por lo que esta respuesta no es concluyente"

SQLite no tiene una clase de almacenamiento reservada para almacenar fechas y/u horas. En su Lugar, la Fecha Y Las funciones de tiempo de SQLite son capaces de almacenar fechas y horas como TEXTO, REAL, o ENTERO valores:

 -2
Author: ceph3us,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-12-25 16:27:30