Bases de Datos

Tipos TEXT en MySQL: TINYTEXT, TEXT, MEDIUMTEXT, LONGTEXT

Autorangel cruz
Publicado
Lectura6 min de lectura
Actualizado

Cuando diseño una tabla siempre llega la misma pregunta: para un campo de texto largo, ¿qué tipo uso? MySQL ofrece cuatro tipos de cadena pensados para esto —TINYTEXT, TEXT, MEDIUMTEXT y LONGTEXT— y la única diferencia real entre ellos es cuántos bytes pueden almacenar. Elegir el correcto desde el principio te evita migrar la tabla a mitad del proyecto.

Aquí va la respuesta directa y, después, todo lo que conviene saber para no equivocarte.

Tamaño máximo de cada tipo

Tipo Tamaño máximo (bytes) Equivalente Prefijo de longitud
TINYTEXT 255 (2⁸−1) 255 B 1 byte
TEXT 65 535 (2¹⁶−1) 64 KiB 2 bytes
MEDIUMTEXT 16 777 215 (2²⁴−1) 16 MiB 3 bytes
LONGTEXT 4 294 967 295 (2³²−1) 4 GiB 4 bytes

Ese 4 294 967 295 es el famoso límite de LONGTEXT: cuatro gigabytes por valor. Cada tipo guarda, además del contenido, un prefijo de longitud de 1 a 4 bytes que indica el tamaño del dato.

El tamaño en bytes es fijo, pero la cantidad de caracteres que entran depende de la codificación que uses. No es lo mismo latin1 (1 byte por carácter) que utf8mb4 (hasta 4 bytes por carácter).

TINYTEXT en MySQL

Hasta 255 bytes. Es el más chico de la familia y rara vez lo elijo: para cadenas cortas casi siempre me conviene más un VARCHAR(n), que se indexa completo y puede tener valor por defecto. TINYTEXT tiene sentido si quiero comportamiento de tipo TEXT (almacenamiento fuera de fila, sin DEFAULT literal) en un campo muy pequeño.

TEXT en MySQL

Hasta 65 535 bytes (64 KiB). Es el caballo de batalla: comentarios, descripciones, biografías, mensajes. Cubre la inmensa mayoría de los casos de "texto largo" sin desperdiciar nada. Si no estás seguro de cuál usar y el contenido es texto humano normal, TEXT es la apuesta segura.

MEDIUMTEXT en MySQL

Hasta 16 777 215 bytes (16 MiB). Lo uso cuando el contenido puede crecer de verdad: artículos completos en HTML o Markdown, payloads JSON medianos, el cuerpo serializado de un documento. Es el escalón que casi nadie recuerda que existe y que muchas veces es justo lo que hace falta antes de saltar a LONGTEXT.

LONGTEXT en MySQL

Hasta 4 294 967 295 bytes (4 GiB). Para datos realmente grandes: documentos enormes, dumps, contenido en base64, logs acumulados. Funciona, pero antes de llegar a ese extremo vale la pena preguntarse si una base de datos relacional es el lugar correcto para ese dato; muchas veces conviene guardar el archivo en un object storage (S3, Spaces) y dejar en MySQL solo la referencia.

Comparativas rápidas

LONGTEXT vs TEXT

Misma semántica, distinto techo: TEXT llega a 64 KiB y LONGTEXT a 4 GiB. La regla que sigo es usar el tipo más chico que cubra mi caso real. Un LONGTEXT "por las dudas" no es gratis: complica los índices y puede inflar el uso de memoria en operaciones que materializan la columna (por ejemplo, ciertos GROUP BY o tablas temporales).

MEDIUMTEXT vs TEXT

TEXT son 64 KiB; MEDIUMTEXT, 16 MiB. Si tu contenido puede superar los 64 KiB —un artículo largo, un JSON que crece— TEXT te va a truncar el dato en silencio (o lanzar error según el modo SQL). Ahí MEDIUMTEXT es el salto natural.

TEXT vs VARCHAR

Esta es la duda más común. La diferencia práctica:

  • VARCHAR(n): pensado para cadenas con una longitud máxima conocida (hasta 65 535 bytes, compartidos con el resto de la fila). Se guarda en la fila, se indexa completo y admite DEFAULT. Ideal para nombres, emails, slugs, títulos.
  • TEXT y familia: para contenido grande o sin tope claro. Se almacena fuera de la fila (en InnoDB), no admite DEFAULT literal antes de MySQL 8.0.13 y solo se indexa por prefijo.

Si conozco el límite y es razonable, voy con VARCHAR. Si el texto es grande o impredecible, voy con TEXT/MEDIUMTEXT.

Bytes vs caracteres: el matiz que casi nadie explica

El máximo en bytes no cambia, pero los caracteres que entran sí, según la codificación. Con utf8mb4 (la que deberías estar usando), un carácter ocupa hasta 4 bytes, así que el máximo en caracteres es el límite en bytes dividido entre 4:

Tipo Máx. en latin1 (1 B/car.) Máx. en utf8mb4 (≤4 B/car.)
TINYTEXT 255 63
TEXT 65 535 16 383
MEDIUMTEXT 16 777 215 4 194 303
LONGTEXT 4 294 967 295 1 073 741 823

Por eso un campo que "entraba justo" en latin1 puede quedarte corto al migrar a utf8mb4. Es un detalle que se paga caro si aparece en producción.

Detalles que importan en producción

  • Overhead del prefijo: cada valor agrega 1, 2, 3 o 4 bytes según el tipo, además del contenido.
  • Índices por prefijo: no puedes indexar una columna TEXT completa; tienes que indicar una longitud, por ejemplo INDEX (columna(255)). El máximo del prefijo depende del motor y el formato de fila (en InnoDB, 767 bytes por defecto, hasta 3072 con formato DYNAMIC/COMPRESSED).
  • Almacenamiento fuera de fila: InnoDB guarda los valores grandes en páginas de overflow, no inline. La fila solo lleva un puntero, por eso puedes tener varias columnas TEXT sin chocar contra el límite de 65 535 bytes por fila.
  • DEFAULT: los tipos TEXT no aceptan un valor por defecto literal antes de MySQL 8.0.13.

Cuándo usar cada uno

  • Cadena corta con tope conocido (nombre, email, slug) → VARCHAR(n).
  • Texto humano normal hasta 64 KiB (comentarios, descripciones) → TEXT.
  • Contenido que puede crecer hasta 16 MiB (artículos, Markdown largo, JSON mediano) → MEDIUMTEXT.
  • Datos enormes hasta 4 GiB (documentos, base64, logs) → LONGTEXT (y considera un object storage externo).

Con eso ya tienes con qué diseñar tus tablas sin tener que rehacerlas después. Y si trabajas seguido con MySQL, te puede servir también la diferencia entre WHERE y HAVING, otra duda clásica a la hora de escribir queries.

Preguntas frecuentes

¿Cuál es el tamaño máximo de LONGTEXT en MySQL?

4 GiB: exactamente 4 294 967 295 bytes (2³²−1) por valor.

¿Cuántos caracteres caben en un TEXT?

Depende de la codificación. En bytes el tope es 65 535; con utf8mb4 (hasta 4 bytes por carácter) eso equivale a unos 16 383 caracteres, y con latin1, a 65 535.

¿Uso LONGTEXT o TEXT?

El más chico que cubra tu caso real. TEXT (64 KiB) alcanza para casi todo; pasa a MEDIUMTEXT o LONGTEXT solo si el contenido lo justifica. Sobredimensionar complica índices y memoria.

¿TEXT o VARCHAR?

VARCHAR para cadenas cortas con longitud acotada (se indexa completo y admite DEFAULT); TEXT para contenido grande o sin tope claro.

Lecturas recomendadas