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

Tipo Tamaño (bytes) Rango con signo (Signed) Rango sin signo (Unsigned) Uso recomendado
TINYINT 1 -128 a 127 0 a 255 Flags, edades pequeñas
SMALLINT 2 -32,768 a 32,767 0 a 65,535 IDs pequeños
MEDIUMINT 3 -8,388,608 a 8,388,607 0 a 16,777,215
INT 4 -2,147,483,648 a 2,147,483,647 0 a 4,294,967,295 Uso general
BIGINT 8 -9.2e18 a 9.2e18 0 a 1.8e19 IDs grandes, contadores

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.
Recomendación: Para valores monetarios, siempre usa DECIMAL. Nunca FLOAT o DOUBLE.

Tipos de Cadena

Tipo Tamaño máximo Características
CHAR(n) 255 caracteres Longitud fija (rellena con espacios)
VARCHAR(n) 65,535 bytes Longitud variable (recomendado)
TINYTEXT 255 bytes
TEXT 65,535 bytes Uso común
MEDIUMTEXT 16 MB Artículos largos
LONGTEXT 4 GB Documentos muy grandes
TINYBLOB / BLOB / MEDIUMBLOB / LONGBLOB Igual que TEXT Datos binarios
  • 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

Tipo Formato Rango Uso recomendado
DATE YYYY-MM-DD 1000-01-01 a 9999-12-31 Solo fechas
TIME HH:MM:SS -838:59:59 a 838:59:59 Duraciones
DATETIME YYYY-MM-DD HH:MM:SS 1000-01-01 00:00:00 a 9999-12-31 23:59:59 Fechas y horas (sin zona horaria)
TIMESTAMP YYYY-MM-DD HH:MM:SS 1970-01-01 00:00:01 a 2038-01-19 Registros con zona horaria automática
YEAR YYYY o YY 1901-2155 Solo año
  • TIMESTAMP se convierte automáticamente a UTC y soporta zona horaria.
  • DATETIME guarda la fecha y hora tal cual.
UTC (Tiempo Universal Coordinado) es el estándar de tiempo principal que utiliza el mundo para regular los relojes. Es el "reloj central" global y sirve como referencia universal base para calcular todas las demás zonas horarias del planeta

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.