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
  • email
  • 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.