text и varchar - это одно и то же на уровне реализации postgresql.
varchar с каким-то разумным ограничением (не бессмысленный взятый с потолка 255 везде, а разумный для этого конкретного поля) тем не менее смысл имеет: куда проще найти ошибку в месте записи данных, чем потом искать, откуда в поле обычно содержащем до 30 символов взялось 10 мегабайт текста (история из практики, да)
Про char ограничусь цитатой письма
Tom Lane
Type character(N) is a hangover from the days of punched cards. Don't use it.
Просто забудьте про такой тип данных. Он не только бесполезен, но и вреден.