Você deve perceber as vantagens e desvantagens de usar CHAR vs VARCHAR
Com os campos CHAR, o que você aloca é exatamente o que recebe. Por exemplo, CHAR (15) aloca e armazena 15 bytes, independentemente de como você coloca os caracteres no campo. A manipulação de strings é simples e direta, pois o tamanho do campo de dados é totalmente previsível.
Com os campos VARCHAR, você obtém uma história completamente diferente. Por exemplo, o VARCHAR (15) na verdade aloca dinamicamente até 16 bytes, até 15 para dados e, pelo menos, 1 byte adicional para armazenar o comprimento dos dados. Se você tiver a string 'hello' para armazenar que terá 6 bytes, não 5. A manipulação da string sempre deve executar alguma forma de verificação de comprimento em todos os casos.
A troca é mais evidente quando você faz duas coisas:
1. Armazenando milhões ou bilhões de linhas
2. Colunas de indexação que são CHAR ou VARCHAR
TRADEOFF # 1
Obviamente, o VARCHAR possui a vantagem, já que dados de comprimento variável produziriam linhas menores e, portanto, arquivos físicos menores.
TRADEOFF # 2
Como os campos CHAR requerem menos manipulação de sequência devido às larguras fixas, as pesquisas de índice no campo CHAR são, em média, 20% mais rápidas que as dos campos VARCHAR. Esta não é nenhuma conjectura da minha parte. O livro MySQL Database Design and Tuning executou algo maravilhoso em uma tabela MyISAM para provar isso. O exemplo no livro fez algo como o seguinte:
ALTER TABLE tblname ROW_FORMAT=FIXED;
Essa diretiva força os VARCHARs a se comportarem como CHARs. Eu fiz isso no meu trabalho anterior em 2007 e peguei uma tabela de 300 GB e acelerou as pesquisas de índice em 20%, sem alterar mais nada. Funcionou como publicado. No entanto, produziu uma tabela com quase o dobro de tamanho, mas isso simplesmente remonta ao tradeoff # 1.
Você pode analisar os dados que estão sendo armazenados para ver o que o MySQL recomenda para a definição de colunas. Basta executar o seguinte em qualquer tabela:
SELECT * FROM tblname PROCEDURE ANALYSE();
Isso percorrerá a tabela inteira e recomendará definições de coluna para todas as colunas com base nos dados que ela contém, nos valores mínimos de campo, no máximo e assim por diante. Às vezes, você só precisa usar o bom senso ao planejar CHAR vs VARCHAR. Aqui está um bom exemplo:
Se você estiver armazenando endereços IP, a máscara para essa coluna terá no máximo 15 caracteres (xxx.xxx.xxx.xxx). Eu pularia direto no CHAR (15) em um piscar de olhos, porque os comprimentos dos endereços IP não variariam muito e a complexidade adicional da manipulação de strings controlada por um byte adicional. Você ainda pode fazer uma ANÁLISE DE PROCEDIMENTO () nessa coluna. Pode até recomendar VARCHAR. Meu dinheiro ainda estaria em CHAR sobre VARCHAR nesse caso.
Os problemas CHAR x VARCHAR podem ser resolvidos apenas através do planejamento adequado. Com grande poder vem grande responsabilidade (clichê, mas é verdade)