WordPress nachträglich von utf8 auf utf8mb4 umstellen

Beim Update auf WordPress 4.2 wurde der Zeichensatz der Datenbank von utf8 auf utf8mb4 umgestellt (zum Beispiel notwendig für die volle Unterstützung von Emojis), sofern ein paar Voraussetzungen erfüllt waren. Hier zeige ich, wie ihr diese Umstellung manuell vornehmen könnt, wenn ihr bei dem 4.2-Update die Anforderungen noch nicht erfüllt habt.

Anforderungen für das utf8mb4-Update

Wie im Beitrag »The utf8mb4 Upgrade« von Gary Pendergast zu lesen, sind folgende Voraussetzungen zu erfüllen:

  • Ihr nutzt aktuell den utf8-Zeichensatz.
  • Ihr habt eine MySQL-Version höher oder gleich 5.5.3 (oder eine 10.x-Version von MariaDB).
  • Die MySQL-Client-Bibliotheken sind 5.5.3 oder höher. Bei mysqlnd 5.0.9 oder höher.

Da mein Hoster Uberspace wegen CentOS 6 die MySQL-Vorgabe aktuell noch nicht erfüllt, habe ich diese Umstellung bei 4.2 nicht automatisch mitgemacht. Als ich heute beim Speichern eines Emojis gescheitert bin und Bernhard Kau mich auf den Pfad mit utf8mb4 gebracht hat, habe ich mich nach einer Lösung umgesehen. Im Beitrag »utf8mb4 auf uberspace« auf crusy.net bin ich fündig geworden – die Lösung ist eine Umstellung auf MariaDB.

Wenn ihr inzwischen einfach eine ausreichende MySQL-Version habt oder auswählen könnt, dann könnt ihr vermutlich über phpMyAdmin oder ähnliche Tools den Zeichensatz der Datenbank anpassen (das habe ich aber nicht getestet, da es bei mir aktuell wegen des obigen Umstandes nur lokal eine Lösung wäre).

In jedem Fall müssen die Tabellen danach noch auf utf8mb4 umgestellt werden – die Änderung des Datenbank-Zeichensatzes reicht nicht aus.

Tabellen auf utf8mb4 umstellen

Auf wordpress.stackexchange.com bin ich auf eine Lösung für dieses Problem gestoßen. Dabei wird die Update-Routine von 4.2 (beziehungsweise 4.3, da das Core-Team von WordPress das bei 4.3 auch nochmal durchgeführt hat, um weitere Sites umzustellen) in ein Plugin oder die functions.php eures Themes eingefügt und über den URL-Parameter ?update-utf8bm4=1 aufgerufen. Dadurch werden alle Tabellen auf utf8mb4 umgestellt, bei denen das automatisch möglich ist.

Ich habe das in ein kleines Plugin gepackt, das ihr als Gist auf GitHub finden könnt. Bei einer Multisite müsst ihr den Parameter von jeder der Sites aufrufen. Wenn ihr die Änderung vorgenommen habt, solltet ihr das Plugin wieder löschen!

12 Reaktionen zu »WordPress nachträglich von utf8 auf utf8mb4 umstellen«

  1. Guter Bericht. Vielen Dank.
    Ich weis nun nicht warum ich auf utf8mb4 umstellen sollte. Was ist der Unterschied zu utf8? Und welchen Vorteil hat eine Umstellung?

    1. Hi Schoelu,

      ich hatte mit utf8 (kann nur Zeichen mit drei Bytes speichern) Probleme bei der Speicherung diverser Emojis – utf8mb4 kann auch Zeichen speichern, die vier Bytes benötigen, und dazu gehören unter anderem (mindestens einige) Emojis 🙂

  2. Vielen lieben Dank für diese Anleitung, ich habe seit Wochen das selbe Problem, das ich nur wenige oder kaum Emojis nutzen kann, da sie nicht gespeichert wurden!!

  3. Ach, warum das Ganze? Das hätte doch an den Anfang des Artikels gehört, damit man überhaupt einen Grund erkennt, den Artikel zu lesen...

    Lernt man schon in der Schule beim Aufsatzschreiben ;=)

    nichts für ungut, aber was nützt ein Tutorial wenn man nicht weiß obs einen interessieren sollte?

  4. Hallo Florian,

    vor dem Update meines WP klappte es mit Deinem installiertem Plugin, dass Emojis gespeichert wurden.

    Nach meinem WP-Update auf 4.9 (bzw. 4.9.1) nun leider nicht mehr.

    1. Hi Peter,

      das Plugin sollte eigentlich nur einmal kurz aktiviert werden müssen, um die Zeichensätze entsprechend anzupassen – danach sollte es nicht mehr notwendig sein und der Zeichensatz sollte sich bei einem Update eigentlich auch nicht wieder zurück auf utf8 umstellen (denke ich jedenfalls). Ist der Zeichensatz deiner Datenbank und der Tabellen wieder auf dem alten Stand?

      Viele Grüße
      Florian

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert