To elaborate on ypercube's correct comment, the problem is not that there is fragmentation on the
VARCHAR, but in rows that contain variable length data.
If I were to have a table with these values:
| i | v |
| 1 | some |
| 2 | small |
| 3 | text |
And then issue:
UPDATE my_table SET v = 'dinosaur' WHERE i = 2
Then, depending on the storage engine, I might find that there's just no room for the word 'dinosaur' within the existing row location, since rows were written sequentially and compactly to disk. That might mean I would need to change the location of row #2, or place my 'dinosaur' text on an external location, or what have you.
On the other hand, if I were to issue:
UPDATE my_table SET v = 'a'
There would now be a lot of wasted space; I might be interested in reclaiming that space.
This is the fragmentation problem within rows.