Respuesta corta: no hay diferencias prácticas, de rendimiento o de almacenamiento.
Respuesta larga:
Esencialmente no hay diferencia (en MySQL) entre VARCHAR(3000)
(o cualquier otro límite grande) y TEXT
. El primero se truncará a 3000 caracteres ; este último se truncará a 65535 bytes . (Hago una distinción entre bytes y caracteres porque un personaje puede tomar varios bytes).
Para límites más pequeños VARCHAR
, hay algunas ventajas sobre TEXT
.
- "más pequeño" significa 191, 255, 512, 767 o 3072, etc., según la versión, el contexto y
CHARACTER SET
.
INDEXes
están limitados en qué tan grande se puede indexar una columna. (767 o 3072 bytes ; esto depende de la versión y la configuración)
- Las tablas intermedias creadas por complex
SELECTs
se manejan de dos maneras diferentes: MEMORY (más rápido) o MyISAM (más lento). Cuando están involucradas columnas 'grandes', la técnica más lenta se selecciona automáticamente. (Cambios significativos en la versión 8.0; por lo tanto, este elemento de viñeta está sujeto a cambios).
- En relación con el elemento anterior, todos los
TEXT
tipos de datos (en oposición a VARCHAR
) saltan directamente a MyISAM. Es decir, TINYTEXT
es automáticamente peor para las tablas temporales generadas que el equivalente VARCHAR
. (¡Pero esto lleva la discusión en una tercera dirección!)
VARBINARY
es como VARCHAR
; BLOB
es como TEXT
.
Refutación a otras respuestas.
La pregunta original preguntaba una cosa (qué tipo de datos usar); la respuesta aceptada respondió algo más (almacenamiento no registrado). Esa respuesta ahora está desactualizada.
Cuando este hilo se inició y respondió, solo había dos "formatos de fila" en InnoDB. Poco después, se introdujeron dos formatos más ( DYNAMIC
y COMPRESSED
).
La ubicación de almacenamiento para TEXT
y VARCHAR()
se basa en el tamaño , no en el nombre del tipo de datos . Para una discusión actualizada sobre el almacenamiento dentro / fuera del registro de grandes columnas de texto / blob, vea esto .