2017-02-24 1 views
2

Ich habe eine MySQL-Datenbank (myDB; ~ 2GB Größe) mit 4 Tabellen (tab1, tab2, tab3, tab4). Derzeit wurden die Daten, die in den Tabellen gespeichert sind, unter Verwendung des Zeichensatzes ISO-8859-1 (d. H. Latin-1) hinzugefügt.Wie migge MySQL-Datenbank von Latin-1 zu UTF-8?

Ich möchte die Daten in allen Tabellen konvertieren UTF-8 und UTF-8 als Standard-Zeichensatz der Tabellen/database/Spalten verwenden.

Auf https://blogs.harvard.edu/djcp/2010/01/convert-mysql-database-from-latin1-to-utf8-the-right-way/ fand ich einen interessanten Ansatz:

mysqldump myDB | sed -i 's/CHARSET=latin1/CHARSET=utf8/g' | iconv -f latin1 -t utf8 | mysql myDB2 

Ich habe es noch nicht ausprobiert, aber gibt es irgendwelche Einschränkungen?

Gibt es eine Möglichkeit, es direkt in der MySQL-Shell zu tun?

[EDIT:]

Ergebnis SHOW CREATE TABLE messages; nach ALTER TABLE messages CONVERT TO CHARACTER SET utf8mb4;

CREATE TABLE `messages` (
    `number` int(11) NOT NULL AUTO_INCREMENT, 
    `status` enum('0','1','2') NOT NULL DEFAULT '1', 
    `user` varchar(30) NOT NULL DEFAULT '', 
    `comment` varchar(250) NOT NULL DEFAULT '', 
    `text` mediumtext NOT NULL, 
    `date` int(11) NOT NULL DEFAULT '0', 
    PRIMARY KEY (`number`), 
    KEY `index_user_status_date` (`user`,`status`,`date`) 
) ENGINE=InnoDB AUTO_INCREMENT=3285217 DEFAULT CHARSET=utf8mb4 

Antwort

2

läuft Es ist möglich, die Tabellen zu konvertieren. Aber dann müssen Sie die Anwendung auch konvertieren.

ALTER TABLE tab1 CONVERT TO utf8mb4; 
etc. 

Um zu überprüfen, tun SHOW CREATE TABLE tab1; Es sollte Ihnen CHARACTER SET utf8mb4 zeigen.

Hinweis: Es gibt 3 Dinge geht:

  • Konvertieren Sie die Codierung der Daten in irgendwelchen VARCHAR und TEXT Spalten.
  • Ändern Sie die CHARACTER SET für solche Spalten.
  • Ändern Sie die DEFAULT CHARACTER SET für die Tabelle - dies kommt ins Spiel, wenn Sie neue Spalten ohne Angabe eines Zeichensatzes hinzufügen.

Die Anwendung ...

Wenn Sie von einem Client zu MySQL zu verbinden, müssen Sie ihnen sagen, in einer App-spezifischen Art und Weise oder über SET NAMES, die Codierung des Bytes in dem Client. Dies muss nicht müssen die gleichen wie die Spalte Deklarationen sein; Die Konvertierung erfolgt bei Bedarf unter INSERT und SELECT.

Ich empfehle Ihnen, eine Sicherungskopie zu erstellen und/oder eine Kopie einer der Tabellen zu testen. Achten Sie darauf, den ganzen Weg zu gehen - Einfügen, Auswahl, Anzeige, usw.

+0

Ich lief 'ALTER TABLE tab1 KONVERT AUF CHARAKTER SET utf8mb4;' Sie sagten, dass 'Konvertieren Sie die Codierung der Daten in allen Spalten VARCHAR und TEXT .' findet während dieses Schrittes statt. Das habe ich auch auf https://dev.mysql.com/doc/refman/5.7/en/alter-table.html#alter-table-character-set gefunden. Aber tatsächlich ** die Daten in meiner Tabelle gespeichert wurden nicht konvertiert ** - es ist immer noch in "Latin-1" - nur die Standardeinstellungen und der Datentyp einiger Spalten wurde geändert (ich habe 'diff dump_before_convert.sql dump_after_cobert.sql' auf ausgeführt die Müllkippen). Wie kann ich die aktuell in 'latin-1' gespeicherten Daten in' utf-8mb4' umwandeln? –

+0

Bitte zeigen Sie die aktuelle 'SHOW CREATE TABLE' (zumindest für diese Spalte) und' SELECT HEX (col) ... 'an. Ohne beides ist es schwer zu sagen, was tatsächlich in der Spalte steht und ob das in Ordnung ist oder nicht. –

Verwandte Themen