Eine der Antworten auf eine Frage, die ich gestern gestellt habe schlug vor, ich solle sicherstellen, dass meine Datenbank UTF-8-Zeichen korrekt verarbeiten kann. Wie kann ich das mit MySQL machen?
Update:
Kurze Antwort - Sie sollten fast immer die utf8mb4
-Zeichenfolge und utf8mb4_unicode_ci
-Sortierung verwenden.
Datenbank ändern:
ALTER DATABASE dbname CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
Sehen:
Aarons Kommentar zu dieser Antwort Wie man MySQL richtig mit UTF-8 umgehen lässt
Was ist der Unterschied zwischen utf8_general_ci und utf8_unicode_ci
Conversion Guide: https://dev.mysql.com/doc/refman/5.5/de/charset-unicode-conversion.html
Ursprüngliche Antwort:
MySQL 4.1 und höher enthält einen Standardzeichensatz von UTF-8. Sie können dies in Ihrer my.cnf
-Datei überprüfen. Denken Sie daran, sowohl Client als auch Server (default-character-set
und character-set-server
) einzustellen.
Wenn Sie bereits Daten haben, die Sie in UTF-8 konvertieren möchten, sichern Sie Ihre Datenbank und importieren Sie sie wieder als UTF-8.
SET NAMES utf8
, bevor Sie die Datenbank abfragen/einfügenDEFAULT CHARSET=utf8
, wenn Sie neue Tabellen erstellenmy.cnf
). Denken Sie daran, dass alle von Ihnen verwendeten Sprachen (wie PHP) ebenfalls UTF-8 sein müssen. Einige Versionen von PHP verwenden eine eigene MySQL-Client-Bibliothek, die möglicherweise nicht UTF-8-kompatibel ist.Wenn Sie vorhandene Daten migrieren möchten, müssen Sie zuerst ein Backup erstellen! Wenn die Dinge nicht wie geplant ablaufen, kann es zu seltsamen Datenverschlüssen kommen.
Einige Ressourcen:
Um dies "permanent" zu machen, in my.cnf
:
[client]
default-character-set=utf8
[mysqld]
character-set-server = utf8
Um dies zu überprüfen, gehen Sie zum Client und zeigen Sie einige Variablen an:
SHOW VARIABLES LIKE 'character_set%';
Stellen Sie sicher, dass alle utf8
sind, mit Ausnahme von ..._filesystem
, das binary
und ..._dir
sein sollte und auf irgendwo in der MySQL-Installation verweist.
MySQL 4.1 und höher hat einen Standardzeichensatz, den es utf8
aufruft, der jedoch nur eine Teilmenge von UTF-8 ist (nur drei Byte große Zeichen erlaubt).
Verwenden Sie utf8mb4
als Zeichensatz, wenn Sie "full" UTF-8 wünschen.
Die kurze Antwort: Verwenden Sie utf8mb4
an 4 Stellen:
SET NAMES utf8mb4
oder etwas Äquivalent, wenn die Verbindung des Clients zu MySQL hergestellt wirdCHARACTER SET utf8mb4
für alle Tabellen/Spalten - mit Ausnahme von Spalten, die streng ascii/hex/country_code/zip_code/etc sind.<meta charset charset=UTF-8>
, wenn Sie in HTML ausgeben. (Ja, die Schreibweise ist hier anders.)Die oben genannten Links geben an, dass "eine detaillierte kanonische Antwort erforderlich ist, um alle Bedenken auszuräumen". - In diesem Forum gibt es eine Begrenzung.
Bearbeiten
Neben CHARACTER SET utf8mb4
, das "alle" Zeichen der Welt enthält, ist COLLATION utf8mb4_unicode_520_ci
die beste Allround-Sortierung, die verwendet werden soll. (Es gibt auch Kollatierungen für Türkisch, Spanisch usw. für diejenigen, die die Nuancen in diesen Sprachen wünschen.)
Der Zeichensatz ist eine Eigenschaft der Datenbank (Standard) und der Tabelle . Sie können einen Blick darauf werfen (MySQL-Befehle):
show create database foo;
> CREATE DATABASE `foo`.`foo` /*!40100 DEFAULT CHARACTER SET latin1 */
show create table foo.bar;
> lots of stuff ending with
> ) ENGINE=InnoDB AUTO_INCREMENT=252 DEFAULT CHARSET=latin1
Mit anderen Worten; Sie können Ihren Datenbankzeichensatz ganz einfach überprüfen oder ändern:
ALTER TABLE `foo`.`bar` CHARACTER SET utf8;
Um die Zeichensatzkodierung für die Datenbank selbst in UTF-8 zu ändern, geben Sie den folgenden Befehl an der Eingabeaufforderung mysql> Prompt ein. USE ALTER DATABASE
.. Ersetzen Sie DBNAME durch den Datenbanknamen:
ALTER DATABASE DBNAME CHARACTER SET utf8 COLLATE utf8_general_ci;
Dies ist ein Duplikat dieser Frage Wie konvertiert man ein gesamtes MySQL-Datenbank-Zeichensatz und eine Kollatierung in UTF-8?
Ich folgte Javiers Lösung, fügte jedoch einige andere Zeilen in my.cnf hinzu:
[myslqd]
skip-character-set-client-handshake
collation_server=utf8_unicode_ci
character_set_server=utf8
Ich habe diese Idee hier gefunden: http://dev.mysql.com/doc/refman/5.0/de/charset-server.html im ersten/einzigen Benutzerkommentar am unteren Rand der Seite. Er erwähnt, dass überspringen-Zeichensatz-Client-Handshake eine gewisse Bedeutung hat.
Setzen Sie Ihren database collation
auf UTF-8
Und wenden Sie dann table collation
auf den Datenbankstandard an.
Diese Tipps zu MySQL und UTF-8 können hilfreich sein. Leider stellen sie keine vollständige Lösung dar, sondern nur gängige Fallstricke.