В вашем случае вы пытаетесь оптимизировать место на диске и в памяти, что совсем не тоже самое, что оптимизировать скорость запросов.
1) Столбцу необходимо указывать тот тип данных, который для него подходит, и не обязательно минимально возможный. Чтобы понять имеет ли смысл экономить место, нужно проанализировать ваши запросы - по каким именно столбцам происходит поиск - вот их оптимизировать в первую очередь. Если запросы не выполняют поиск по вашему текстовому полю, то особо нет разницы какой оно длины - строка будет найдена например по id primary кей. а прочитать 2 кб или 3 кб - разницы нет. То есть ВСЕ поля минимизировать для ускорения нет смысла, разве что для уменьшения памяти.
2) sql не адресует биты, он все равно будет выделять минимально байт для хранения флага. enum не означает 2 байта, enum может означать список флагов, это вполне может быть и 1 байт со значениям 0 и 1. или 0,1,2. Зависит от базы.
3) text - удобно, если вы не знаете точный размер. varchar хранится прямо в строке, text и blob хранит там ссылку, а сами данные хранятся отдельно. С точки зрения оптимизации памяти - текст выгоднее. С точки зрения скорости доступа к данным - varchar быстрее. Плюс по text нельзя индексировать.
4) Если поле все время пустое, и вы сделали char0, то в памяти будет выделяться новая область каждый раз, когда вы в существующую строку но с пустым полем будете добавлять что-то в это поле. А если varchar(2000), то для всех существующих записей память будет выделена сразу при запуске mysql, и обновление будет происходить быстрее чем создание новой записи.
5) varchar(2000) для всех значений. На случай если вы вдруг измените строку в таблице, и чтобы это место в памяти не "раздвигать", перемещая ВСЕ данные.