Entwicklung und Datenbanken

MySQL 8, Änderung der Zeichenkodierung von latin1 auf utf8mb4

Geprüft am 3 Min. Lesezeit Zeichenkodierung MySQL

Die Standardwerte des Herstellers haben sich von latin1 in MySQL 5.7 auf utf8mb4 in MySQL 8 geändert. Die Konfiguration eines Servers kann abweichen. Ein Update von MySQL konvertiert nicht automatisch alle vorhandenen Tabellen; entscheidend ist auch der Zeichensatz, den die Anwendung beim Verbindungsaufbau aushandelt.

Diese Änderung ist in der Regel kein Problem, da Anwendungen den zu verwendenden Zeichensatz in der Verbindungsschicht zu MySQL festlegen. Bei sehr alten Anwendungen oder Eigenentwicklungen kann das jedoch fehlen, sodass nach der Umstellung Daten mit „seltsamen“ Zeichen auf dem Bildschirm erscheinen.

Prüfen Sie vor jeder Änderung die tatsächliche Kodierung der Tabellen und die Konfiguration, die die Anwendung erwartet. latin1 zu erzwingen ist nur richtig, wenn das Projekt und seine Daten weiterhin diesen Zeichensatz verwenden; damit lassen sich keine Daten reparieren, die bereits konvertiert oder mit einer falschen Kodierung gespeichert wurden.

Prüfen, wo das Problem auftritt

Prüfen Sie ein bekanntes Textbeispiel in der Datenbank und auf der Website, ohne es vorerst erneut zu speichern. Wenn phpMyAdmin es korrekt anzeigt und Ihre Anwendung nicht, prüfen Sie die Verbindung und die Kodierung der HTML-Antwort. Wenn es bereits falsch gespeichert ist, repariert eine Änderung der Verbindung es nicht. Arbeiten Sie mit einer Kopie, bevor Sie versuchen, Daten zu konvertieren.

Über dieselbe Verbindung, die die Anwendung verwendet, können Sie Folgendes abfragen:

SELECT @@character_set_client, @@character_set_connection,
       @@character_set_results, @@collation_connection;

Wenn Sie dies in phpMyAdmin ausführen, sehen Sie die Sitzung von phpMyAdmin, nicht die Ihrer Anwendung. Prüfen Sie außerdem den Zeichensatz der betroffenen Spalten; er kann vom Standard der Tabelle abweichen.

Eine latin1-Anwendung vorübergehend beibehalten

Legen Sie den Zeichensatz im Konnektor selbst fest. Mit MySQLi:

mysqli_set_charset($connection, 'latin1');

Bei PDO geben Sie ihn beim Erstellen der Verbindung im DSN an:

$dsn = 'mysql:host=localhost;dbname=BASE_DE_DATOS;charset=latin1';
$connection = new PDO($dsn, $user, $password);

Verwenden Sie weder mysql_select_db() noch mysql_query(): Sie gehören zur alten Erweiterung mysql, die seit Version 7 aus PHP entfernt ist. Es ist auch nicht empfehlenswert, mit MySQLi manuell SET NAMES zu senden, denn mysqli_set_charset() hält den Zeichensatz synchron, den der Client beim Escapen von Zeichenketten verwendet.

Die Umstellung vorbereiten

Wenn das Projekt vollständiges Unicode unterstützt, planen Sie die Konvertierung zu utf8mb4 mit einem Klon, einem wiederherstellbaren Backup sowie Lese- und Schreibtests. Stellen Sie keine Anwendung auf latin1 um, die utf8mb4 bereits korrekt verwendet.

Das könnte Ihnen auch helfen

Stimmt etwas nicht oder hat sich etwas geändert? Erzählen Sie es uns, und wir prüfen es.