Auszug aus den MySQL documentation:
Die CHAR und VARCHAR-Typen sind ähnlich, unterscheiden sie aber in der Art, wie sie gespeichert und abgerufen. Ab MySQL 5.0.3 unterscheiden sie sich auch in der maximalen Länge und darin, ob nachgestellte Leerzeichen beibehalten werden.
Die CHAR- und VARCHAR-Typen werden mit einer Länge deklariert, die die maximale Anzahl von Zeichen angibt, die Sie speichern möchten. Zum Beispiel kann CHAR (30) bis zu 30 Zeichen enthalten.
Die Länge einer CHAR-Spalte wird auf die Länge festgelegt, die Sie beim Erstellen der Tabelle angeben. Die Länge kann ein beliebiger Wert zwischen 0 und 255 sein. Wenn CHAR-Werte gespeichert werden, werden sie rechts mit Leerzeichen auf die angegebene Länge aufgefüllt. Wenn CHAR-Werte abgerufen werden, werden nachfolgende Leerzeichen entfernt.
Werte in VARCHAR-Spalten sind Zeichenfolgen variabler Länge. Die Länge kann als ein Wert von 0 bis 255 vor MySQL 5.0.3 und von 0 bis 65.535 in 5.0.3 und höheren Versionen angegeben werden. Die effektive maximale Länge eines VARCHAR in MySQL 5.0.3 und höher hängt von der maximalen Zeilengröße (65.535 Byte, die von allen Spalten gemeinsam genutzt wird) und dem verwendeten Zeichensatz ab.
Im Gegensatz zu CHAR werden VARCHAR-Werte als Ein-Byte- oder Zwei-Byte-Längenpräfix plus Daten gespeichert. Das Längenpräfix gibt die Anzahl der Bytes im Wert an. Eine Spalte verwendet ein Längenbyte, wenn Werte nicht mehr als 255 Byte benötigen, zwei Längenbytes, wenn Werte mehr als 255 Byte erfordern.
mögliches Duplikat von [Gibt es Nachteile bei der Verwendung eines generischen varchar (255) für alle textbasierten Felder?] (Http://stackoverflow.com/questions/262238/are-there-diedanta-to-using-a -generic-varchar255-für-alle-text-based-fields) –
Auch http://stackoverflow.com/questions/1262174/mysql-why-use-varchar20-instead-of-varchar255 –
Dachte immer die MySQL-Dokumentation war ziemlich gut darin, den Unterschied zu erklären: http://dev.mysql.com/doc/refman/5.0/en/char.html –