Wie kann ich den gesamten MySQL-Datenbankzeichensatz in UTF-8 und die Sortierung in UTF-8 konvertieren?
459
Wie kann ich den gesamten MySQL-Datenbankzeichensatz in UTF-8 und die Sortierung in UTF-8 konvertieren?
utf8_unicode_ci
nichtutf8_general_ci
.utf8mb4
als vielmehrutf8
alsutf8
nur die Grund mehrsprachiger Ebene unterstützt als das gesamte Spektrum gegenüber . Es erfordert MySQL 5.5.3 oder höher.utf8mb4
Sie auch die Sortierung aufutf8mb4_unicode_ci
utf8mb4_unicode_520_ci
oder was auch immer die neueste verfügbare Version ist.Antworten:
Verwenden Sie die Befehle
ALTER DATABASE
undALTER TABLE
.Oder wenn Sie noch mit MySQL 5.5.2 oder älter arbeiten, das 4-Byte-UTF-8 nicht unterstützt, verwenden Sie
utf8
anstelle vonutf8mb4
:quelle
CONVERT TO
Technik wird davon ausgegangen, dass der Text in einem anderen Zeichensatz (z. B. latin1) korrekt gespeichert und nicht entstellt wurde (z. B. UTF-8-Bytes, die ohne Konvertierung in latin1 in die Spalte latin1 gepackt wurden).Mach ein Backup!
Dann müssen Sie die Standardzeichensätze in der Datenbank festlegen. Dadurch werden vorhandene Tabellen nicht konvertiert, sondern nur die Standardeinstellungen für neu erstellte Tabellen festgelegt.
Anschließend müssen Sie den Zeichensatz für alle vorhandenen Tabellen und deren Spalten konvertieren. Dies setzt voraus, dass sich Ihre aktuellen Daten tatsächlich im aktuellen Zeichensatz befinden. Wenn Ihre Spalten auf einen Zeichensatz festgelegt sind, Ihre Daten jedoch tatsächlich in einem anderen gespeichert sind, müssen Sie im MySQL-Handbuch nachlesen, wie Sie damit umgehen sollen.
quelle
utf8_general_ci
nicht mehr als bewährte Methode empfohlen wird. Seit MySQL 5.5.3 sollten Sieutf8mb4
eher als verwendenutf8
. Beide beziehen sich auf die UTF-8-Codierung, aber die älterenutf8
hatten eine MySQL-spezifische Einschränkung, die die Verwendung der oben nummerierten Zeichen verhinderte0xFFFD
.Auf der Kommandozeilen-Shell
Wenn Sie eine der Befehlszeilen-Shell sind, können Sie dies sehr schnell tun. Geben Sie einfach "Datenbankname" ein: D.
Einzeiler zum einfachen Kopieren / Einfügen
quelle
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'DB="dbname"
DB="db_name"; ( echo 'ALTER DATABASE
'"$ DB"' `CHARACTER SET utf8 COLLATE utf8_general_ci; '; mysql --uuser -ppassword -hhost "$ DB" -e "SHOW TABLES" --batch --skip-column-names | xargs -I {} echo 'SET alien_key_checks = 0; ALTER TABLE'{}'
CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci; ' ) | mysql -uuser -ppassword -hhost "$ DB" `Sie können die SQL erstellen, um alle Tabellen zu aktualisieren mit:
Erfassen Sie die Ausgabe und führen Sie sie aus.
Die Antwort von Arnold Daniels oben ist eleganter.
quelle
WHERE TABLE_SCHEMA=webdb_playground
Sie den unbekannten Spaltenfehler erhaltenWHERE TABLE_SCHEMA="webdb_playground"
haben, aber erfolgreich gewesen wären. Etwas zu versuchen, falls jemand anderes darauf stößt.Bevor Sie fortfahren, stellen Sie sicher, dass Sie: eine vollständige Datenbanksicherung abgeschlossen haben!
Schritt 1: Änderungen auf Datenbankebene
Identifizieren der Sortierung und des Zeichensatzes Ihrer Datenbank
Korrigieren der Sortierung für die Datenbank
Schritt 2: Änderungen auf Tabellenebene
Identifizieren von Datenbanktabellen mit dem falschen Zeichensatz oder der falschen Sortierung
Anpassen der Sortierung und des Zeichensatzes von Tabellenspalten
Erfassen Sie die obere SQL-Ausgabe und führen Sie sie aus. (wie folgt)
Siehe: https://confluence.atlassian.com/display/CONFKB/How+to+Fix+the+Collation+and+Character+Set+of+a+MySQL+Database
quelle
Verwenden Sie HeidiSQL . Es ist kostenlos und ein sehr gutes DB-Tool.
Rufen Sie im Menü Extras den Bulk-Tabelleneditor auf
Wählen Sie die vollständige Datenbank aus oder wählen Sie die zu konvertierenden Tabellen aus.
Ausführen
Dadurch wird die gesamte Datenbank in wenigen Sekunden von Latin nach Utf8 konvertiert.
Klappt wunderbar :)
HeidiSQL stellt standardmäßig eine Verbindung als utf8 her, sodass Sonderzeichen jetzt als Zeichen (æ ø å) und nicht mehr als codiert bei der Überprüfung der Tabellendaten angesehen werden sollten.
Die eigentliche Gefahr beim Wechsel von Latin zu Utf8 besteht darin, sicherzustellen, dass pdo mit dem Zeichensatz utf8 verbunden ist. Wenn nicht, werden überall auf Ihrer Webseite Mülldaten in die utf8-Tabelle und Fragezeichen eingefügt, sodass Sie glauben, dass die Tabellendaten nicht utf8 sind ...
quelle
Inspiriert von @sdfor Kommentar, ist hier ein Bash-Skript, das die Arbeit erledigt
quelle
Falls sich die Daten nicht im selben Zeichensatz befinden, können Sie dieses Snippet von http://dev.mysql.com/doc/refman/5.0/en/charset-conversion.html in Betracht ziehen
Hier ist ein Beispiel:
Stellen Sie sicher, dass Sie die richtige Sortierung auswählen, da sonst eindeutige Schlüsselkonflikte auftreten können. z. B. könnten Éleanore und Eleanore in einigen Zusammenstellungen als gleich angesehen werden.
Beiseite:
Ich hatte eine Situation, in der bestimmte Zeichen in E-Mails "kaputt gingen", obwohl sie als UTF-8 in der Datenbank gespeichert waren. Wenn Sie E-Mails mit utf8-Daten senden, möchten Sie möglicherweise auch Ihre E-Mails so konvertieren, dass sie in UTF8 gesendet werden.
Aktualisieren Sie in PHPMailer einfach diese Zeile:
public $CharSet = 'utf-8';
quelle
Für Datenbanken mit einer hohen Anzahl von Tabellen können Sie ein einfaches PHP-Skript verwenden, um den Zeichensatz der Datenbank und aller Tabellen wie folgt zu aktualisieren:
quelle
quelle
quelle
Am sichersten ist es, die Spalten zuerst in einen Binärtyp und dann mit dem gewünschten Zeichensatz wieder in diesen Typ zu ändern.
Jeder Spaltentyp hat seinen jeweiligen Binärtyp wie folgt:
Z.B.:
Ich habe es in mehreren Latin1-Tabellen versucht und es wurden alle diakritischen Zeichen beibehalten.
Sie können diese Abfrage für alle Spalten extrahieren, die dies tun:
Nachdem Sie dies für alle Ihre Spalten getan haben, tun Sie dies für alle Tabellen:
Verwenden Sie die folgende Abfrage, um diese Abfrage für alle Ihre Tabellen zu generieren:
Und jetzt, da Sie alle Ihre Spalten und Tabellen geändert haben, machen Sie dasselbe in der Datenbank:
quelle
Wenn Sie Ihre Tabellen nicht zum Konvertieren bringen können oder Ihre Tabelle immer auf einen Nicht-utf8-Zeichensatz eingestellt ist, Sie aber utf8 möchten, ist es möglicherweise am besten, sie zu löschen und erneut zu beginnen und explizit anzugeben:
quelle
Die einzige Lösung, die für mich funktioniert hat: http://docs.moodle.org/23/de/Converting_your_MySQL_database_to_UTF8
Konvertieren einer Datenbank mit Tabellen
quelle
alter table table_name charset = 'utf8';
Dies ist eine einfache Abfrage, die ich für meinen Fall verwenden konnte. Sie können den Tabellennamen gemäß Ihren Anforderungen ändern.
quelle
Geben Sie den folgenden Befehl an der Eingabeaufforderung mysql> ein, um die Zeichensatzcodierung für die Datenbank selbst in UTF-8 zu ändern. Ersetzen Sie DBNAME durch den Datenbanknamen:
quelle
Sie können auch das DB-Tool Navicat verwenden, was es einfacher macht.
Klicken Sie mit der rechten Maustaste auf Ihre Datenbank und wählen Sie DB-Eigenschaften und ändern Sie sie wie gewünscht in Dropdown
quelle
Befehlszeilenlösung und Ansichten ausschließen
Ich vervollständige einfach die Antwort von @ Jasny für andere wie
@Brian
und ich, die Ansichten in unserer Datenbank haben.Wenn Sie einen Fehler wie diesen haben:
Dies liegt daran, dass Sie wahrscheinlich Ansichten haben und diese ausschließen müssen. Beim Versuch, sie auszuschließen, gibt MySQL 2 Spalten anstelle von 1 zurück.
Wir müssen also Jasnys Befehl anpassen
awk
, um nur die erste Spalte zu extrahieren, die den Tabellennamen enthält.Einzeiler zum einfachen Kopieren / Einfügen
quelle
Befolgen Sie die einfachen Schritte in PHPMyAdmin, um die Zeichensatzcodierung in UTF-8 zu ändern
Wählen Sie Ihre Datenbank aus
Gehen Sie zu Operationen
quelle