it-swarm.com.de

Wie man MySQL dazu bringt, UTF-8 richtig zu handhaben

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?

84
Ben

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: 

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.

  • verwenden Sie SET NAMES utf8, bevor Sie die Datenbank abfragen/einfügen
  • verwenden Sie DEFAULT CHARSET=utf8, wenn Sie neue Tabellen erstellen
  • zu diesem Zeitpunkt sollten sich Ihr MySQL-Client und -Server in UTF-8 befinden (siehe my.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:

71
Owen

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.

38
Javier

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.

30
T.W.R. Cole

Die kurze Antwort: Verwenden Sie utf8mb4 an 4 Stellen:

  • Die Bytes in Ihrem Client sind utf8, nicht latin1/cp1251/etc.
  • SET NAMES utf8mb4 oder etwas Äquivalent, wenn die Verbindung des Clients zu MySQL hergestellt wird
  • CHARACTER 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.)

Mehr Info ;
ganz UTF8

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.)

19
Rick James

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;
4
extraneon

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?

2
Nyein Aung

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.

1
Vlad Balan

Setzen Sie Ihren database collation auf UTF-8 Und wenden Sie dann table collation auf den Datenbankstandard an.

0
Gaurav Lad

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.

0
Edward Z. Yang