TEXT : comme son nom l'indique, c'est pour enregistrer du texte
BLOB : Binary Long OBject. C'est pour stocker des données binaires, comme par exemple des images et des fichiers quelconques.
On ne donne pas de taille pour les champs du type TEXT ou BLOB. C'est MySQL qui gère ça tout seul. Sous Oracle, par exemple, passé une certaine taille, les champs BLOB et CLOB (l'équivalent de TEXT) sont stockés dans des fichiers à part. Du coup, il peut y avoir une baisse de perf et un pb de cache pour les gros champs. Mais en dessous de cette taille critique, je pense que le comportement de VARCHAR() et de TEXT est le même. A confirmer cependant par un vrai gars qui connaît mieux MySQL que moi.