Tipos de datos en MySQL: los datos correctos se aceptan, los incorrectos son rechazados
En lenguajes de programación es importante definir los tipos de datos por razones de validación, orden y lógica, permitiendo cálculos entre datos correctos y evitando inconsistencias de tipo.
Además, declarar el tipo de dato correcto hará que los datos incorrectos sean rechazados por el sistema gestor de base de datos. Por ejemplo, el sistema agradecerá que solo los números sean recibidos como tipo de dato número, –en la forma INT
– y no como texto varchar("10")
.
Otra razón es cuidar los bits de memoria disponible (y acelerar así los cálculos de las consultas) en el servidor de la base de datos. Un tipo de dato muy grande (como LONGTEXT
, con capacidad para 4 millones de caracteres) será ineficiente para alojar, por ejemplo, el nombre de una persona.
Así mismo, el tipo de dato SMALLINT
(hasta 32mil caracteres) será suficiente para declarar datos numéricos para claves primarias; útiles y optimizadas gracias a que son tipo número, lo que permite apuntar velozmente a filas con datos.
En otro caso, usar el tipo de dato numérico INT
(hasta 2 mil millones de caracteres) podría recortar (o truncar) números decimales. Por lo que es recomendabe usar DECIMAL()
, con capacidad de hasta 30 decimales.
A continuación muestro una tabla actualizada para explicar cada tipo de dato en MySQL, junto con su aplicación desde la sintaxis, según w3schools MySQL Data Types
Datos string o caracteres en línea
CodigoProducto char(10)
);
char() Aloja longitud de cero a 255 caracteres. Si la longitud es menor a la longitud definida, el sistema rellena los espacios (lo que puede provocar exceso de memoria). El valor de 1 es predeterminado .
direccion varchar(200)
);
varchar() Aloja longitud variable de alfanuméricos, de 0 a 65535 caracteres. No agrega espacios faltantes. Es útil cuando no estás seguro de su longitud exacta: desde 'hola' hasta 'holacomoestantodosenGuayaquil!'
imagen binary(16)
);
binary(16) Aloja longitud de bytes o en caracteres ASCII (donde un caracter equivale a un número de dos dígitos). Agrega ceros de relleno.
FotoPerfil varbinary(8)
);
varbinary() Aloja un número máximo de bytes o caracteres en ASCII. No agrega ceros de relleno.
Icono tinyblob
);
tinyblob Limitado a 255 bytes de datos binarios extensos, o Binary Large OBjects (blobs).
Comentario tinytext
);
tinytext Línea de caracteres de máximo 255 caracteres (1 byte por carácter). Útil para descripciones breves.
comentario text
);
text Aloja hasta 65.535 caracteres (64 Kb), pero solo puede indexar los primeros 1,000 bytes.
archivo blob
);
blob (Binary Large Object). Puede almacenar hasta 65,535 bytes (64 KB). Ideal para almacenar contenido como imágenes y otros archivos multimedia. No convierte el registro, sino que lo aloja tal como es insertado.
contenido mediumtext
);
mediumtext Aloja hasta 16,777,215 caracteres. Ideal para almacenar artículos, descripciones largas.
file_imagen mediumblob
);
mediumblob Para alojar datos binarios grandes, como imágenes, audios o archivos; hasta 16,777,215 bytes (16 MB).
articulo longtext
);
longtext Para alojar texto extenso de hasta 4 millones de caracteres (4 GB de texto, posiblemente libros medianos).
file_video LONGBLOB
);
LONGBLOB Para alojar datos binarios extremadamente grandes, como videos HD.
estado enum('activo',
'inactivo')
);
enum("estado1", "estado2",... ) Para una columna que debta tener un conjunto limitado de valores, como estados o tipos. Si se deben actualizar los estados, requerirá una actualización de la definición de la columna.
habilidades
SET('Java', 'Python')
);
SET('val1', 'val2') Aloja una lista de valores predefinidos. SET puede contener varios valores de la lista, separados por comas. Permite seleccionar desde varios valores.
Tipos de datos numéricos
activo bit(1)
);
bit(1) Ocupa menos espacio para alojar valores binarios (0 o 1, la cantidad de bits a alojar). Si es bit(1) valor por defecto, solo podrá almacenar uno de dos valores (0 o 1), útil para valores booleanos. Si es bit(0) no tiene sentido. Aloja máximo 64 bits (o sea, bit(64)).
edad tinyint
);
tinyint Dato entero que ocupa solo 1 byte de almacenamiento. Con un rango de -128 a 127, y de 0 a 255 para positivos. Útil para alojar edades o cualquier valor que no sobrepase las 120 unidades.
activo bool
);
bool Aloja valor booleano puro: 1 es true, 0 es false.
antiguedad SMALLINT
);
SMALLINT Aloja 2 bytes: negativos de entre -32,768 hasta 32,767 caracteres. Y positivos de 0 hasta 65,535 caracteres. Ocupa menos espacio que INT.
cantidad MEDIUMINT
);
MEDIUMINT Ocupa 3 bytes de almacenamiento. De 8,388,608 a 8,388,607, y para valores sin signo es de 0 a 16,777,215. Útil para cantidades que no superan millones.
nombre INT(20)
);
INT(20) Aloja datos de 4 bytes, independiente del valor entre paréntesis. Ese valor únicamente muestra la cantidad de caracteres que serán visibles durante la consulta.
precio DECIMAL(5, 2)
);
DECIMAL(5, 2) Aloja cantidad de entero con cantidad decimal. Útil para valores financieros, costos, sin valores redondeados. En el ejemplo, se pueden almacenar 5 enteros, con 2 valores decimales. Número máximo de enteros: 65 unidades. Número máximo para decimales, 30 unidades.
tempertura DOUBLE(10, 3)
);
DOUBLE(10, 3) Aloja valores que requieren decimales, pero no de precisión exacta. double() es útil para magnitudes físicas, longitudes, etc.
Tipos de datos fechas y tiempo
ingreso DATE NOT NULL
);
DATE: Permite formato de año-mes-dia. Ejemplo 2025-01-20
evento DATETIME NOT NULL
);
DATETIME Registra fecha y hora-tiempo en formato YYYY-MM-DD hh:mm:ss
, como 2025-01-16 14:30:00. Al agregar DEFAULT y ON UPDATE inicializa y actualiza a la fecha y hora actuales. Es un tipo de dato para transacciones, tiempo límite. Útil para valores de fecha y hora.
(creado_en TIMESTAMP
DEFAULT);
TIMESTAMP Aloja marcas de tiempo actual, precisas, en sistemas donde los datos dependen de la hora; ejemplo, para guardar fecha y hora de actualización de una fila.
hola TIME
);
TIME: Aloja tiempo en HH:MM:SS
. Si se desea precisión fraccional de ms agregar TIME(3), ejemplo: 12:34:56.789123
. Tipo de dato común para registrar tiempo dedicado a una tarea, horarios de apertura/cierre de un negocio, cálculos de tiempo como en sumatoria o diferencia de horarios.
anio YEAR
);
YEAR: Aloja valores únicamente de año de cualquier evento. El ingreso es en número, sin comillas; pero también como cadena de texto. No es adecuado para fechas completas: Para ello mejor DATE, DATETIME o TIMESTAMP
.
Se resume aquí los tipos para caracteres de texto, de menor a mayor capacidad (o límite):
-
tinytext
Hasta 255 caracteres -
text
Hasta 65.535 caracteres (64KB) -
mediumtext
16.777.215 caracteres ( 16MB) -
longtext
4'294.967.295 (4GB)
Se resume aquí los tipos para números, de menor a mayor capacidad (o límite):
-
tinyint
De –128 hasta 127 caracteres -
smallint
De –32,768 hasta 32,767 caracteres -
mediumint
De –8,388,608 hasta 8,388,607 caracteres -
int
De –2'147.483.648 hasta 2'147.483.647 caracteres -
bigint
Hasta 9.223.372'036.854.775.808
Se resume aquí (no fueron expuestos más arriba) los tipos llamados de datos de locación, de menor a mayor capacidad (o límite) (basado en Silva, 2019):
-
geometry
Valores de locación, como vértices de polígonos, puntos, etc. -
point
Valores de altitud, longitud -
linestring
Representa puntos y la curva entre ellos, como la ubicación de una autopista. -
polygon
Representa un límite, como alrededor de un país o una ciudad. -
multipoint
Almacena una colección desordenada de tipos de puntos
El contenido de esta sección podrá ser actualizada. Para revisar otras secciones, dejo aquí los vínculos:
-
Introducción al lenguaje SQL
para diseño de datos relacionales -
Crear base de datos
, insertar tablas, definir tipos de datos y restricciones -
Restricciones
(constrains), claves primarias, claves foráneas, conexión entre tablas. -
Recuperación de datos
mediante sentencias select, from, where... -
Inicio de duduromeroa.com
BIBLIOGRAFÍA
Silva, Rick (2019). MYSQL CRASH COURSE, A Hands-on Introduction to Database Development. No Starch Press, Inc.MySQL Data Types (Version 8.0)