Extracto del MySQL documentation:
Los tipos CHAR y VARCHAR son similares, pero difieren en la forma en que se almacenan y recuperan. A partir de MySQL 5.0.3, también difieren en longitud máxima y en si se conservan los espacios finales.
Los tipos CHAR y VARCHAR se declaran con una longitud que indica la cantidad máxima de caracteres que desea almacenar. Por ejemplo, CHAR (30) puede contener hasta 30 caracteres.
La longitud de una columna CHAR se fija a la longitud que declara cuando crea la tabla. La longitud puede ser cualquier valor de 0 a 255. Cuando se almacenan los valores de CHAR, se rellenan con espacios a la longitud especificada. Cuando se recuperan los valores CHAR, se eliminan los espacios finales.
Los valores en las columnas VARCHAR son cadenas de longitud variable. La longitud se puede especificar como un valor de 0 a 255 antes de MySQL 5.0.3 y de 0 a 65.535 en 5.0.3 y versiones posteriores. La longitud máxima efectiva de un VARCHAR en MySQL 5.0.3 y posterior está sujeta al tamaño máximo de fila (65.535 bytes, que se comparte entre todas las columnas) y al juego de caracteres utilizado.
En contraste con CHAR, los valores VARCHAR se almacenan como un prefijo de un byte o de dos bytes más los datos. El prefijo de longitud indica la cantidad de bytes en el valor. Una columna utiliza un byte de longitud si los valores no requieren más de 255 bytes, dos bytes de longitud si los valores pueden requerir más de 255 bytes.
posible duplicado de [¿Hay desventajas al usar un varchar genérico (255) para todos los campos basados en texto?] (Http://stackoverflow.com/questions/262238/are-there-disadvantages-to-using-a -generic-varchar255-for-all-text-based-fields) –
Además, http://stackoverflow.com/questions/1262174/mysql-why-use-varchar20-instead-of-varchar255 –
Siempre pensé que la documentación de MySQL era bastante bueno para explicar la diferencia: http://dev.mysql.com/doc/refman/5.0/en/char.html –