HOWTO · SQLite
Tipo de datos booleano en la base de datos SQLite
Obtenga información sobre el tipo de datos booleano en la base de datos SQLite.
En esta página
SQLite no tiene una clase de almacenamiento booleana independiente. Aun así, puede representar valores booleanos: la convención habitual es guardar 0 para falso y 1 para verdadero en una columna de tipo entero. Una convención de texto coherente es otra opción cuando resulta adecuada para una aplicación o para una interfaz con la que intercambia datos.
Tipo de datos booleano en la base de datos SQLite
SQLite no tiene una clase de almacenamiento booleana nativa. Elige una representación y úsala de forma coherente en el esquema, los valores insertados y las consultas. Los enteros son la opción práctica predeterminada; una restricción CHECK puede limitar una columna a los dos estados previstos, ya que declararle un tipo no basta para hacerlo.
Representar valores booleanos como enteros
Para una bandera de dos estados, la convención de enteros guarda falso como 0 y verdadero como 1. Declara la columna como INTEGER para dejar claro su propósito y añade CHECK (flag IN (0, 1)) para limitar los valores almacenados a esas dos opciones. SQLite usa tipado flexible, por lo que la declaración por sí sola no garantiza que todos los valores almacenados sean uno de ellos. La restricción expresa la regla en la base de datos, donde SQLite la hace cumplir en las inserciones y actualizaciones de cualquier cliente. Esa aplicación tiene un límite que conviene declarar con claridad: una expresión CHECK solo falla cuando se evalúa como falsa. Como NULL IN (0, 1) se evalúa como NULL y no como falso, la restricción por sí sola sigue admitiendo NULL; mantener NULL fuera es la tarea independiente de NOT NULL, que se trata a continuación.
NOT NULL responde a otra pregunta: si la bandera debe tener un valor en cada fila. Sin esta restricción, una fila puede contener NULL, que significa desconocido o no proporcionado, no falso. Usa ambas restricciones cuando cada registro deba tener una respuesta definida. Si la aplicación permite intencionadamente una bandera sin responder, omite NOT NULL y haz que las consultas tengan en cuenta NULL de forma explícita.
Inserta los valores numéricos 0 y 1, preferiblemente mediante parámetros enlazados en el código de la aplicación. Para consultar las filas verdaderas, usa WHERE flag = 1; para las falsas, WHERE flag = 0. No mezcles estas comparaciones con cadenas como 'true'. Así, la convención queda clara en cada capa y se evita que distintas partes de una aplicación interpreten de manera diferente la misma columna. El ejemplo crea una tabla de estudiantes, inserta cinco filas y lee cada bandera almacenada. También crea una tabla independiente con etiquetas de texto para comparar directamente ambas convenciones.
import sqlite3
connection = sqlite3.connect(":memory:")
connection.execute("""
CREATE TABLE students (
id INTEGER PRIMARY KEY,
name TEXT NOT NULL,
age INTEGER NOT NULL,
international_student INTEGER NOT NULL
CHECK (international_student IN (0, 1))
)
""")
connection.executemany(
"INSERT INTO students (id, name, age, international_student) VALUES (?, ?, ?, ?)",
[
(1, "Stefan", 13, 1),
(2, "Damon", 14, 0),
(3, "Elena", 12, 1),
(4, "Caroline", 12, 1),
(5, "Bonnie", 13, 0),
],
)
integer_rows = connection.execute(
"SELECT name, international_student FROM students ORDER BY id"
).fetchall()
connection.execute("""
CREATE TABLE student_flags (
student_id INTEGER PRIMARY KEY,
international_student TEXT NOT NULL
CHECK (international_student IN ('true', 'false'))
)
""")
connection.executemany(
"INSERT INTO student_flags VALUES (?, ?)",
[(1, "true"), (2, "false"), (3, "true"), (4, "true"), (5, "false")],
)
text_rows = connection.execute(
"SELECT student_id, international_student FROM student_flags ORDER BY student_id"
).fetchall()
print("Integer convention:", integer_rows)
print("Text convention:", text_rows)
Integer convention: [('Stefan', 1), ('Damon', 0), ('Elena', 1), ('Caroline', 1), ('Bonnie', 0)]
Text convention: [(1, 'true'), (2, 'false'), (3, 'true'), (4, 'true'), (5, 'false')]
Las filas mostradas conservan los valores enteros de la primera tabla y las etiquetas de texto de la segunda. El ejemplo selecciona todas las filas para que se vea la representación almacenada; en una consulta de aplicación, añade un predicado como WHERE international_student = 1 para la tabla de enteros. Mantén el tipo de literal elegido en consonancia con la convención de la columna.
Representar valores booleanos como cadenas
El texto resulta útil cuando un formato externo ya usa etiquetas como true y false, o cuando estas facilitan la inspección de los valores almacenados. Declara la columna como TEXT, elige una escritura y un uso de mayúsculas coherentes, y valida los valores con una restricción CHECK, como en student_flags más arriba. La consulta devuelve directamente las etiquetas de texto; el código de la aplicación debe seguir la misma convención al escribirlas y leerlas. La afinidad de tipo de SQLite no convierte ninguna de las dos declaraciones en un tipo booleano ni limita por sí sola la columna a dos valores.
Con esta convención, las inserciones deben usar las etiquetas de texto elegidas y las consultas deben compararlas con la misma etiqueta, por ejemplo WHERE international_student = 'true'. Una lista en CHECK mantiene coherente la escritura, mientras que NOT NULL exige que cada fila contenga una de las etiquetas. El texto puede encajar con una interfaz o un formato de archivo que ya intercambie palabras, pero añade una convención que todos los lectores y escritores deben seguir. Evita mezclar valores como 1, TRUE y true, porque las comparaciones y el análisis en la aplicación necesitarían reglas adicionales.
En la mayoría de las tablas cuya bandera se usa como un valor de dos estados dentro de la base de datos, usa INTEGER con 0 y 1, además de NOT NULL y CHECK cuando cada fila deba contener un valor definido y restringido. Elige texto cuando sea útil ajustarse a una interfaz textual ya establecida. Antes de decidirte por una representación, comprueba cómo codifican el campo los datos existentes y los clientes. Documenta la correspondencia, aplícala en el esquema, enlaza los valores usando la misma representación y emplea comparaciones compatibles en todas las consultas. También se puede declarar BOOLEAN como nombre de tipo de afinidad en SQLite, pero esto no crea una clase de almacenamiento booleana independiente ni sustituye las restricciones que hacen cumplir la regla de la aplicación.