TIPOS DE DATOS EN MYSQL: GUÍA COMPLETA
MySQL es uno de los sistemas de gestión de bases de datos relacionales más utilizados del mundo. Elegir correctamente el tipo de dato para cada columna es fundamental para optimizar el almacenamiento, mejorar el rendimiento de las consultas y garantizar la integridad de los datos.Tipos Numéricos
Enteros
Decimales
- DECIMAL(M,D) o NUMERIC(M,D): Exacto (ideal para dinero). M = dígitos totales, D = decimales.
- FLOAT: Aproximado, 4 bytes.
- DOUBLE: Aproximado, 8 bytes, mayor precisión que FLOAT.
Tipos de Cadena
- Usa VARCHAR en la mayoría de casos.
- Define la longitud real que necesitas (VARCHAR(100) en lugar de VARCHAR(255) si no lo requieres).
- Para texto muy largo, considera usar TEXT o incluso almacenar en disco y guardar solo la ruta.
Tipos Fecha y Hora
- TIMESTAMP se convierte automáticamente a UTC y soporta zona horaria.
- DATETIME guarda la fecha y hora tal cual.
Otros Tipos
- JSON (desde MySQL 5.7.8): Almacena documentos JSON de forma nativa con indexación y funciones optimizadas.
- ENUM('value1', 'value2', ...): Lista de valores predefinidos (ahorra espacio).
- SET('value1', 'value2', ...): Combinación de varios valores de una lista.
- BOOLEAN o BOOL: Alias de TINYINT(1). TRUE = 1, FALSE = 0.
- GEOMETRY, POINT, LINESTRING, etc.: Tipos espaciales (GIS).
- BIT(M): Campos de bits (M entre 1 y 64).
Ejemplo
CREATE TABLE usuarios (
idBIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
nombre VARCHAR(80) NOT NULL,
email VARCHAR(120) UNIQUE NOT NULL,
estado ENUM('activo', 'inactivo', 'suspendido') NOT NULL DEFAULT 'activo',
saldo DECIMAL(12,2) NOT NULL DEFAULT 0.00,
fecha_registro DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
ultima_actividad TIMESTAMP NULL ON UPDATE CURRENT_TIMESTAMP,
perfil JSON,
activo BOOLEAN NOT NULL DEFAULT TRUE
);
Consejos Avanzados
- Ser lo más específico posible: Un TINYINT ocupa menos espacio que un INT.
- Evitar TEXT/BLOB innecesarios: Impactan en el rendimiento de las consultas.
- Usar VARCHAR con longitud adecuada: MySQL 5.0+ almacena VARCHAR de forma muy eficiente.
- Considerar compresión: Para columnas TEXT grandes, puedes usar ROW_FORMAT=COMPRESSED.
- JSON vs columnas normales: Usar JSON cuando los datos sean variables o semi-estructurados. Usar columnas normales cuando se necesite máximo rendimiento y filtros frecuentes.
- Collation y Character Set: Definir "utf8mb4_unicode_ci", o "utf8mb4_0900_ai_ci" en MySQL 8, para soporte completo de emojis y caracteres internacionales.