Er zijn 3 verschillende gevallen om te overwegen:
De waarden zijn inderdaad gecodeerd met Latin1
Dit is het consistente geval:gedeclareerde karakterset en inhoudcodering komen overeen. Dit was het enige geval dat ik in mijn eerste antwoord behandelde.
Gebruik de opdracht die je hebt voorgesteld:
ALTER TABLE tablename CONVERT TO CHARSET utf8 COLLATE utf8_bin
Merk op dat de CONVERT TO CHARACTER SET
commando verscheen alleen in MySQL 4.1.2, dus iedereen die een database gebruikte die vóór 2005 was geïnstalleerd, moest een export/import-truc gebruiken. Dit is de reden waarom er zoveel oude scripts en documenten op internet zijn die het op de oude manier doen.
De waarden zijn al gecodeerd met utf8
In dit geval wilt u niet dat mysql gegevens converteert, u hoeft alleen de metagegevens van de kolom te wijzigen.
Hiervoor moet u het type eerst wijzigen in BLOB en vervolgens voor elke kolom in TEXT utf8, zodat er geen waardeconversies zijn:
ALTER TABLE t1 CHANGE c1 c1 BLOB;
ALTER TABLE t1 CHANGE c1 c1 TEXT CHARACTER SET utf8
Dit is de aanbevolen manier, en het is expliciet gedocumenteerd in Alter Documentatie over tabelsyntaxis .
De waarden worden in een andere codering gebruikt
De standaardcodering was enkele jaren Latin1 op een aantal Linux-distributies. In dit geval moet u een combinatie van de twee technieken gebruiken:
- Repareer de metagegevens van de tabel met de truc van het BLOB-type
- Converteer de waarden met
CONVERT TO
.