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.
INDEXesestá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
SELECTsse 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
TEXTtipos de datos (en oposición a VARCHAR) saltan directamente a MyISAM. Es decir, TINYTEXTes automáticamente peor para las tablas temporales generadas que el equivalente VARCHAR. (¡Pero esto lleva la discusión en una tercera dirección!)
VARBINARYes como VARCHAR; BLOBes 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 ( DYNAMICy COMPRESSED).
La ubicación de almacenamiento para TEXTy 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 .