Es sind 3 verschiedene Fälle zu berücksichtigen:
Die Werte sind tatsächlich mit Latin1 kodiert
Dies ist der konsistente Fall:Deklarierter Zeichensatz und Inhaltscodierung stimmen überein. Dies war der einzige Fall, den ich in meiner ursprünglichen Antwort behandelt habe.
Verwenden Sie den von Ihnen vorgeschlagenen Befehl:
ALTER TABLE tablename CONVERT TO CHARSET utf8 COLLATE utf8_bin
Beachten Sie, dass CONVERT TO CHARACTER SET
Der Befehl erschien nur in MySQL 4.1.2, sodass jeder, der eine vor 2005 installierte Datenbank verwendet, einen Export/Import-Trick verwenden musste. Aus diesem Grund gibt es im Internet so viele veraltete Skripte und Dokumente, die es auf die alte Weise tun.
Die Werte sind bereits mit utf8 kodiert
In diesem Fall soll mysql keine Daten konvertieren, Sie müssen nur die Metadaten der Spalte ändern.
Dazu müssen Sie für jede Spalte zuerst den Typ auf BLOB ändern, dann auf TEXT utf8, damit es keine Wertkonvertierungen gibt:
ALTER TABLE t1 CHANGE c1 c1 BLOB;
ALTER TABLE t1 CHANGE c1 c1 TEXT CHARACTER SET utf8
Dies ist der empfohlene Weg, und er ist ausdrücklich in Alter dokumentiert Dokumentation der Tabellensyntax .
Die Werte werden in einer anderen Codierung verwendet
Bei einigen Linux-Distributionen war die Standardcodierung mehrere Jahre lang Latin1. In diesem Fall müssen Sie eine Kombination der beiden Techniken verwenden:
- Reparieren Sie die Metadaten der Tabelle mit dem BLOB-Typ-Trick
- Konvertieren Sie die Werte mit
CONVERT TO
.