Mi rispondo da solo.
Ho una tabella di 300058 record.
Il file d:\xampp\mysql\data\miodb\miatabella.MYD ᅵ di 15.650.748 bytes.
Aggiungo un campo varchar di 250 caratteri alla tabella.
Il file d:\xampp\mysql\data\miodb\miatabella.MYD ᅵ di 16.149.448 bytes.
Rimuovo il campo varchar di 200 caratteri dalla tabella.
Il file d:\xampp\mysql\data\miodb\miatabella.MYD ᅵ di 15.650.748 bytes.
Di conseguenza la risposta ᅵ "ni", se non valorizzo il campo, non occupa
spazio su disco. Perᅵ occupa 1,66 caratteri a record.
Non occupa quei 100, e questa e` la differenza principale
rispetto al CHAR. Tuttavia un po' di spazio viene sempre
occupato da alcune strutture.
Il CHAR viene messo in linea con tutto il record, es.:
valore1, "D'in su la vetta della torre...", valore2
Se la lunghezza e` costante, e` meglio usare il CHAR se le
prestazioni sono importanti. Infatti se tutte le colonne sono
a larghezza prevedibile, sono possibili alcune ottimizzazioni
(es. si sa gia' che ogni record avra' lunghezza uguale a tutti
gli altri, etc).
Normalmente il VARCHAR invece viene implementato come puntatore
a stringa di lunghezza variabile:
valore1, <ptr>, valore2
...e questo causa un po' di frammentazione.
Alla locazione <ptr> troveremo l'indicatore della lunghezza
della stringa, e la stringa vera e propria. Queste strutture
occupano spazio anche se la stringa e` zero, come hai osservato.
L'uso di un puntatore e` praticamente obbligatorio da parte
del dbms per gestire efficientemente il caso di una stringa che
improvvisamente "esploda" di dimensioni.
Tutto questo "a spanne", poi ci sono vari casi particolari etc.