Existem 3 casos diferentes a considerar:
Os valores são realmente codificados usando Latin1
Este é o caso consistente:o conjunto de caracteres declarado e a codificação de conteúdo correspondem. Este foi o único caso que abordei na minha resposta inicial.
Use o comando que você sugeriu:
ALTER TABLE tablename CONVERT TO CHARSET utf8 COLLATE utf8_bin
Observe que o
CONVERT TO CHARACTER SET
O comando só apareceu no MySQL 4.1.2, então qualquer um que usasse um banco de dados instalado antes de 2005 tinha que usar um truque de exportação/importação. É por isso que existem tantos scripts e documentos legados na Internet fazendo isso da maneira antiga. Os valores já estão codificados usando utf8
Neste caso, você não quer que o mysql converta nenhum dado, você só precisa alterar os metadados da coluna.
Para isso, você deve alterar primeiro o tipo para BLOB, depois para TEXT utf8 para cada coluna, para que não haja conversões de valor:
ALTER TABLE t1 CHANGE c1 c1 BLOB;
ALTER TABLE t1 CHANGE c1 c1 TEXT CHARACTER SET utf8
Esta é a maneira recomendada e está explicitamente documentada em Alter Documentação de sintaxe de tabela .
Os valores usados em uma codificação diferente
A codificação padrão foi Latin1 por vários anos em algumas distribuições Linux. Nesse caso, você deve usar uma combinação das duas técnicas:
- Corrija os metadados da tabela, usando o truque do tipo BLOB
- Converta os valores usando
CONVERT TO
.