1. NULL указывает, что поле
может принимать значение NULL, а DEFAULT NULL указывает, что значением по умолчанию для данного поля является NULL. Если в описании поля отсутствует [NOT NULL | NULL], то по умолчанию принимается NULL. Если в описании поля отсутствует [DEFAULT default_value], то при NULL по умолчанию принимается DEFAULT NULL, в противном случае значение по умолчанию не определено.
Например,
То есть, если поле NULL, то DEFAULT NULL можно не указывать.
2. Если поле id является PRIMARY KEY, то независимо оттого, является оно автоинкрементным или нет, нельзя указать для него NULL (будет ошибка). При этом, если отсутствует NOT NULL, то оно подразумевается по умолчанию. Так, что для первичного ключа NOT NULL можно не писать.
3. см. п.2
4. Тип BINARY хранит двоичные (бинарные) строки. Для бинарных данных понятие кодировки не определено, так как понятие кодировки имеет смысл только для текстовых данных. Можно ли менять кодировку для поля BINARY или нет, я не знаю, но это просто бессмысленно.
5. Как реализовано в MySQL я не знаю, но из чисто теоретических соображений, если текстовое поле не может содержать (исходя из модели данных) символов за пределами однобайтовой кодировки, то лучше установить для поля эту однобайтовую кодировку. Во-первых, это уменьшит занимаемое пространство (русские буквы в UTF-8 весят по 2 байта), а во-вторых, если у вас данное поле типа CHAR, то в однобайтовой кодировке оно будет иметь фиксированный размер в байтах, что должно положительно сказаться на производительности.