Hay 3 casos diferentes a considerar:
De hecho, los valores están codificados usando Latin1
Este es el caso consistente:juego de caracteres declarado y coincidencia de codificación de contenido. Este fue el único caso que cubrí en mi respuesta inicial.
Usa el comando que sugeriste:
ALTER TABLE tablename CONVERT TO CHARSET utf8 COLLATE utf8_bin
Tenga en cuenta que CONVERT TO CHARACTER SET
El comando solo apareció en MySQL 4.1.2, por lo que cualquiera que use una base de datos instalada antes de 2005 tuvo que usar un truco de exportación/importación. Esta es la razón por la que hay tantos scripts y documentos heredados en Internet que lo hacen a la antigua.
Los valores ya están codificados usando utf8
En este caso, no desea que mysql convierta ningún dato, solo necesita cambiar los metadatos de la columna.
Para esto, primero debe cambiar el tipo a BLOB, luego a TEXT utf8 para cada columna, para que no haya conversiones de valor:
ALTER TABLE t1 CHANGE c1 c1 BLOB;
ALTER TABLE t1 CHANGE c1 c1 TEXT CHARACTER SET utf8
Esta es la forma recomendada y está explícitamente documentada en Alterar Documentación de sintaxis de tabla .
Los valores se usan en una codificación diferente
La codificación predeterminada fue Latin1 durante varios años en algunas distribuciones de Linux. En este caso, tienes que usar una combinación de las dos técnicas:
- Corrige los metadatos de la tabla usando el truco del tipo BLOB
- Convierta los valores usando
CONVERT TO
.