La lunghezza di una colonna varchar è fissata alla lunghezza dichiarata al momento della creazione della tabella. La lunghezza può essere qualsiasi valore compreso tra 0 e 255 (prima di MySQL 5.0.3) e da 0 a 65.535 (in MySQL 5.0.3 e versioni successive).
La memorizzazione del varchar sono i byte di dati con l'aggiunta di uno o due byte per dichiarare la lunghezza della stringa. Se la lunghezza massima è 255 o meno, verrà aggiunto solo 1 byte di lunghezza.
Se utilizzi alter table e modifichi la lunghezza massima, le dimensioni di archiviazione dei dati non saranno interessate se la lunghezza massima definita è inferiore a 255. Se stai aumentando la lunghezza massima sopra 255, spetta al motore di archiviazione se forza due byte o non per valori inferiori a 255, in tal caso aumenterà di 1 byte per ogni riga.
Il tipo char è diverso da varchar poiché char utilizza sempre lo spazio richiesto, quindi se avessi char(10) e varchar(10) ma avessi memorizzato solo "ciao" in ciascuno, char userebbe tutti i 10 byte, vharchar conterrebbe 6 byte ( 5 per ciao e 1 per la lunghezza), quindi la modifica della dimensione delle colonne varchar non allocherà più spazio di archiviazione come farebbe se fosse un tipo char.
La vera domanda ora è perché vorresti che PHP manipolasse la dimensione di varchar? Dovresti specificare la dimensione per un motivo, se vuoi un campo di lunghezza variabile che possa contenere molto testo (più di 65.535 byte) e anche dinamico in modo che utilizzi solo lo spazio minimo richiesto forse i tipi di TESTO potrebbero essere migliori per la tua situazione ?