make them as small as the largest value that is reasonably expected. If you think firstname will be 20 chars, at most, use that. But also consider what will happen when first user with 21 char firstname uses system, uh-oh! Easier to make columns bigger in the beginning, than later, further down the road.
varchars make this much easier.
with varchar, table size dependent upon data, not definition of table columns. example
tbl1:
fname varchar (5);
tbl2:
fname varchar (200);
Insert 1 row with fname "qball" into each table. both will be the exact same size.
Insert 1 row with fname "kydo76" into each table. tbl1 will generate error, not good. tbl2, no problem.