Tipos TEXT en MySQL: TINYTEXT, TEXT, MEDIUMTEXT, LONGTEXT
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) queutf8mb4(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 admiteDEFAULT. Ideal para nombres, emails, slugs, títulos.TEXTy familia: para contenido grande o sin tope claro. Se almacena fuera de la fila (en InnoDB), no admiteDEFAULTliteral 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
TEXTcompleta; tienes que indicar una longitud, por ejemploINDEX (columna(255)). El máximo del prefijo depende del motor y el formato de fila (en InnoDB, 767 bytes por defecto, hasta 3072 con formatoDYNAMIC/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
TEXTsin chocar contra el límite de 65 535 bytes por fila. DEFAULT: los tiposTEXTno 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.