HOWTO · MySQL

Diferencia entre VARCHAR y TEXT en MySQL

Este tutorial presenta la diferencia entre VARCHAR y TEXT en la base de datos MySQL.

En esta página

Elige VARCHAR cuando el valor tenga un límite máximo declarado útil y se use habitualmente en consultas sobre la columna. Elige TEXT cuando el contenido sea más largo o su tamaño práctico resulte menos predecible. La elección adecuada depende de los datos previstos, del límite que deba aplicar tu aplicación y del uso que las consultas hagan de la columna; ninguno de los dos tipos es siempre más rápido o mejor.

Qué almacenan VARCHAR y TEXT

En MySQL, tanto VARCHAR como TEXT almacenan datos de caracteres, pero expresan expectativas distintas para el esquema. VARCHAR(n) declara una longitud para la columna, por lo que suele ser una opción natural para valores con un máximo conocido, como un nombre para mostrar o una etiqueta corta. Una columna TEXT está pensada para textos más largos, como un comentario de usuario o el cuerpo de un artículo, cuando un máximo declarado pequeño no describiría bien los datos.

Estos nombres de tipo no determinan la política de validación de tu aplicación. Decide qué valores son aceptables antes de insertarlos y elige la columna de acuerdo con esa política. Por ejemplo, un número de teléfono puede ser corto, pero no por ello debe almacenarse automáticamente como número: si se trata como texto, una columna VARCHAR con un límite adecuado definido por la aplicación puede representarlo.

Límites de longitud y costos de almacenamiento

El número de VARCHAR(n) es un límite de caracteres declarado, aunque el valor almacenado puede ser más corto. El almacenamiento real y el tamaño permitido dependen del esquema y de los límites aplicables de MySQL; también influyen el conjunto de caracteres y la definición de las filas. Como estos detalles varían según la versión de MySQL, el conjunto de caracteres y la definición de la tabla, consulta la documentación de tu implementación en lugar de confiar en un cálculo universal del costo en bytes o del tamaño máximo.

No elijas un tipo basándote únicamente en la afirmación de que siempre ocupa menos espacio. Ten en cuenta la longitud prevista de los valores, el límite declarado y el diseño general de la tabla. TEXT ofrece un tipo para contenido más largo, mientras que VARCHAR expresa directamente en el esquema que el valor tiene un límite.

Consideraciones sobre índices y consultas

Las necesidades de indexación deben formar parte del diseño. Considera qué columnas filtra, ordena o usa en uniones tu aplicación, y confirma que la definición del índice sea adecuada para la versión de MySQL y el esquema que vas a implementar. TEXT no es imposible de indexar en todos los casos, pero las opciones y restricciones pueden depender de esos detalles. No des por sentado que alguno de los dos tipos garantiza una velocidad de consulta determinada; si el rendimiento es importante, mide consultas representativas en tu propio entorno.

Elige un tipo para tus datos

Empieza por el significado del valor y el intervalo previsto. Una etiqueta, una dirección de correo electrónico o un nombre para mostrar con un límite definido suele encajar en VARCHAR si puedes establecer un máximo útil. Los comentarios de usuario más largos o el contenido de un artículo pueden encajar en TEXT. Son ejemplos, no reglas fijas: cada aplicación puede tener límites o patrones de consulta distintos.

Después, considera cómo se utiliza la columna. Si se busca en ella o se ordena con frecuencia, incluye ese patrón de acceso al revisar el esquema y los índices. Si el valor tiene un límite claro en el producto, valídalo en la aplicación antes de insertarlo y refleja ese límite en el diseño de la columna. Así se especifica el comportamiento previsto sin depender de cómo el servidor gestione entradas demasiado largas, algo que no se establece aquí.

Ejemplo de esquema y gestión de la longitud

Una tabla de perfiles sencilla podría usar VARCHAR para campos con límites definidos y TEXT para una biografía opcional. El esquema en línea CREATE TABLE profile (display_name VARCHAR(80), phone VARCHAR(32), biography TEXT); ilustra esas funciones; elige límites que se ajusten a tus requisitos y verifica las decisiones de indexación para tu implementación.

Para aplicar un límite de campo desde la aplicación, valida el valor antes de pasarlo a la base de datos. Esta ilustración en Python indica si cada valor cumple una política configurada de recuento de caracteres. La aplicación puede usar un resultado False para rechazar un valor antes de enviarlo, pero el ejemplo solo informa del resultado: no rechaza la entrada por sí mismo, no demuestra cómo MySQL gestiona una inserción demasiado larga ni sustituye las restricciones del servidor. El primer valor tiene 12 caracteres y está dentro del límite de 80; el segundo tiene 81 y lo supera. El código y las etiquetas o salidas visibles de esta sección se mantienen en inglés.

Ejecuta este ejemplo:

values = ["Ada Lovelace", "x" * 81]
max_characters = 80
for value in values:
    print(len(value) <= max_characters)
True
False