Tipos de datos en MySQL y cuándo usar cada uno
Introducción:
Uno de los errores más comunes al empezar con MySQL es pensar que los tipos de datos son un detalle menor. Muchas personas crean tablas rápido, ponen columnas casi por intuición y siguen adelante. El problema es que una mala elección aquí puede afectar el rendimiento, el orden de la información, la consistencia de los datos e incluso complicar bastante el mantenimiento del sistema más adelante.
Elegir bien un tipo de dato no es solo una cuestión técnica. Es una decisión de diseño. Una base de datos bien pensada empieza precisamente por definir qué se va a guardar en cada columna y cuál es la forma más adecuada de almacenarlo.
No es lo mismo guardar una fecha que un texto, ni un precio que un identificador, ni una descripción larga que un nombre corto. MySQL ofrece distintos tipos de datos para responder a necesidades diferentes, y entender cuándo usar cada uno te ayuda a construir tablas más limpias, más seguras y más eficientes.
En esta guía vamos a ver los principales tipos de datos en MySQL, cómo se agrupan y en qué casos conviene usar cada uno. La idea no es memorizar una lista entera, sino entender la lógica detrás de su uso.
Qué son los tipos de datos en MySQL
Cada columna de una tabla necesita un tipo de dato. Ese tipo le dice a MySQL qué clase de información se va a almacenar ahí.
Por ejemplo, si una columna guarda números enteros, debería usar un tipo numérico. Si guarda fechas, debería usar un tipo de fecha. Si guarda un nombre, normalmente necesitará un tipo de texto corto. Y si guarda una descripción larga, un tipo de texto más amplio.
Elegir bien el tipo de dato sirve para varias cosas:
- mantener consistencia
- reducir errores
- optimizar espacio
- mejorar comportamiento de consultas
- facilitar validación de información
En otras palabras, el tipo de dato ayuda a poner orden desde la estructura misma de la tabla.
Tipos de datos numéricos
Los tipos numéricos se usan cuando una columna almacena números. Pero no todos los números son iguales. A veces necesitas enteros, a veces decimales, y a veces cantidades pequeñas.
INT
Es uno de los más usados. Sirve para números enteros y suele utilizarse mucho en identificadores, contadores o cantidades simples.
Cuándo usarlo:
- ids
- cantidad de productos
- número de tickets
- edad
- campos enteros generales
Ejemplos de uso:
- id de usuario
- stock disponible
- número de visitas
BIGINT
Se usa cuando necesitas enteros más grandes que los que soporta un INT normal.
Cuándo usarlo:
- sistemas con muchísimos registros
- identificadores masivos
- valores enteros muy altos
En la mayoría de proyectos pequeños o medianos no vas a necesitarlo de inicio, pero en sistemas grandes sí puede ser útil.
SMALLINT y TINYINT
Se usan cuando los números van a estar en rangos más pequeños.
Cuándo usarlos:
- estados
- contadores muy reducidos
- banderas o valores pequeños
Por ejemplo, un campo activo/inactivo muchas veces se modela con TINYINT.
DECIMAL
Es uno de los más importantes cuando trabajas con importes, precios o valores que requieren precisión exacta.
Cuándo usarlo:
- precios
- importes
- subtotales
- impuestos
- cantidades monetarias
No conviene usar FLOAT o DOUBLE para dinero en la mayoría de casos, porque DECIMAL ofrece un control mucho más preciso.
FLOAT y DOUBLE
Se usan para números con decimales, pero con precisión flotante.
Cuándo usarlos:
- cálculos científicos
- mediciones
- coordenadas
- valores aproximados
No son la mejor opción para dinero ni para casos donde necesites exactitud total.
Tipos de datos de texto
Estos se usan para guardar cadenas de caracteres. Aquí la decisión suele depender principalmente de la longitud del contenido.
VARCHAR
Es probablemente el más utilizado para textos cortos o medianos.
Cuándo usarlo:
- nombres
- apellidos
- emails
- títulos
- slugs
- contraseñas hasheadas
- URLs
- estados escritos
VARCHAR permite definir una longitud máxima y es muy flexible.
Ejemplos:
- nombre
- titulo
- slug
CHAR
Se usa para textos de longitud fija.
Cuándo usarlo:
- códigos muy cortos y uniformes
- abreviaturas
- códigos de país
- valores que siempre tienen el mismo tamaño
No es el más común en aplicaciones generales, pero puede tener sentido en algunos casos específicos.
TEXT
Se usa para textos largos.
Cuándo usarlo:
- contenido de posts
- descripciones extensas
- comentarios largos
- notas internas
- mensajes
Si el texto puede crecer bastante y no tiene sentido limitarlo como un VARCHAR típico, TEXT es mejor opción.
LONGTEXT
Es para textos muchísimo más largos.
Cuándo usarlo:
- artículos muy extensos
- contenido HTML muy grande
- documentos grandes almacenados como texto
En la mayoría de proyectos de blog o contenido, TEXT suele bastar, pero LONGTEXT existe para casos más grandes.
Tipos de fecha y tiempo
Estos tipos se usan para almacenar información temporal.
DATE
Sirve para guardar solo una fecha.
Cuándo usarlo:
- fecha de nacimiento
- fecha de vencimiento
- fecha de evento
- día específico sin importar la hora
DATETIME
Guarda fecha y hora.
Cuándo usarlo:
- fecha de creación
- fecha de actualización
- fecha de pedido
- fecha de registro
- eventos que necesitan marca temporal precisa
Es uno de los más usados en sistemas reales.
TIMESTAMP
También guarda fecha y hora, pero tiene diferencias internas respecto a DATETIME y suele usarse mucho en auditoría y seguimiento temporal.
Cuándo usarlo:
- created_at
- updated_at
- registros automáticos de tiempo
- columnas que cambian con eventos del sistema
TIME
Sirve para guardar solo la hora.
Cuándo usarlo:
- horario de apertura
- duración representada en formato de hora
- franjas horarias
Tipos booleanos y estados simples
MySQL no maneja un boolean puro como otros motores, pero normalmente se representa con TINYINT.
Cuándo usarlo:
- activo o inactivo
- publicado o no publicado
- visible o no visible
- aprobado o rechazado
Ejemplos:
- status = 1
- status = 0
Aunque a veces también se usan ENUM o strings, para estados binarios simples un entero pequeño suele ser suficiente.
Qué es ENUM y cuándo usarlo
ENUM permite restringir una columna a un conjunto concreto de valores.
Cuándo usarlo:
- estados muy definidos
- roles sencillos
- opciones cerradas y pequeñas
Por ejemplo:
- pendiente
- aprobado
- cancelado
Puede ser útil, pero conviene usarlo con criterio. Si el sistema va a crecer o esos valores podrían cambiar, a veces es mejor usar una tabla aparte relacionada.
Qué tipo de dato usar en casos comunes
Aquí es donde todo se vuelve práctico.
Para un id:
- normalmente INT
Para un nombre:
- VARCHAR
Para un email:
- VARCHAR
Para una contraseña hasheada:
- VARCHAR
Para un título:
- VARCHAR
Para una descripción larga:
- TEXT
Para el contenido de un post:
- TEXT o LONGTEXT según el caso
Para un precio:
- DECIMAL
Para una fecha de registro:
- DATETIME o TIMESTAMP
Para un estado activo/inactivo:
- TINYINT
Para una fecha de nacimiento:
- DATE
Errores comunes al elegir tipos de datos
Uno de los más comunes es usar VARCHAR para absolutamente todo. Sí, funciona en apariencia, pero no es una buena práctica si realmente quieres una base de datos bien diseñada.
Otro error frecuente es usar FLOAT para dinero. En la mayoría de escenarios de negocio, lo correcto es DECIMAL.
También es común usar TEXT cuando bastaría un VARCHAR, o al revés, poner un VARCHAR demasiado pequeño para algo que luego crece más de lo esperado.
Otro problema habitual es no pensar en el futuro del dato. Por ejemplo, elegir un tipo de campo solo porque “ahora sirve”, sin considerar cómo se va a consultar, ordenar o validar después.
Cómo decidir mejor qué tipo usar
Hazte estas preguntas:
- qué clase de dato voy a guardar aquí
- este valor será numérico, textual, temporal o lógico
- necesito precisión exacta
- este dato puede crecer mucho
- este campo se consultará o filtrará seguido
- el valor siempre tendrá una longitud parecida
- se trata de una fecha, una hora o ambas cosas
Cuanto mejor entiendas el propósito de la columna, más fácil será elegir el tipo adecuado.
Conclusión:
Los tipos de datos en MySQL son mucho más importantes de lo que parecen al principio. Elegirlos bien no solo mejora la estructura de tu base de datos, también reduce errores, ayuda al rendimiento y hace que el sistema sea mucho más mantenible.
No necesitas memorizar cada tipo desde hoy, pero sí conviene dominar los más comunes: enteros, decimales, textos, fechas y estados simples. Con esa base, ya puedes diseñar tablas con mucha más lógica.
Aprender MySQL bien empieza por entender que los datos no solo se guardan: se modelan.