Wenn ich Projekte aktualisiere, dann schaue ich mir auch immer die Logfiles an. In einem Projekt das ich warte habe ich dabei den folgenden Fehler im Logfile gefunden, der mit zuvor noch nie untergekommen war:
WordPress-Datenbank-Fehler Illegal mix of collations (utf8_general_ci,IMPLICIT) and (utf8mb4_unicode_520_ci,COERCIBLE) for operation 'like' ...
Da WordPress nicht besonders strikt ist mit den Kollationen könnte auch in euer WordPress Website mehr als eine Kollation für die verschiedenen Tabellen verwendet werden. In diesem Project waren es sechs Kollationen!
Konvertieren der Kollationen
Um diesen Fehler zu beheben müssen wir alle Tabellen auf kompatible Kollationen konvertieren. Dabei ist es natürlich am besten, wenn wir für alle Tabellen die gleiche Kollation verwenden. Mit WordPress 4.2.0 wurde utf8mb4
der neue Standard. Alle Datenbank-Tabelle die danach erstellt werden, haben dann eine der Varianten davon. Für unsere neue Kollation verwenden wir also eine davon.
Datenbank sichern!
STOPP! Bevor wir anfangen irgendetwas an der Datenbank zu ändern, machen wir erst einmal ein Backup. Das Ändern der Kollation sollte eigentlich kein Problem darstellen, aber für den Fall der Fälle macht man am besten immer ein Backup. Ihr könnt dabei das Tool eurer Wahl verwenden. Ich verwende in der Regel die WP-CLI dafür:
wp db export
Jetzt können wir gefahrlos die Änderungen machen und im Notfall wieder das Backup einspielen.
Ändern der Kollation einer Tabelle
Wenn man etwas an einer Datenbank oder einer Tabelle ändern möchte, dann verwendet man das ALTER
Statement, welches wir auch hier wie folgt verwenden:
ALTER DATABASE wp_project_name CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_520_ci;
Dieses erste Statement ändert wert einmal die Kollation der gesamten Datenbank. Wenn ihr also danach mit einem Datenbank-Tool eine Tabelle erstellt, dann wird es diese Kollation verwenden. Das Statement ändert aber nichts an den Tabellen der Datenbank. Hierzu müsste ihr die Tabellen wie folgt verändern:
ALTER TABLE wp_project_name.wp_posts CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_520_ci;
Dieses eine Statement würde die Tabelle wp_posts
anpassen. Wiederholt das also nun für alle anderen Tabellen in euer Datenbank.
Aktualisierung einer Datenbank mit vielen Tabellen
In dem Projekt mit dem beschriebenen Fehler gab es 12 Sites mit 344 Tabellen! Da macht es natürlich keinen Spaß jede Tabelle einzeln zu aktualisieren. Glücklicherweise konnte ich einen kleinen Trick finden, der mir alle ALTER TABLE
Statements für alle Tabellen generiert hat:
SELECT CONCAT("ALTER TABLE ",TABLE_SCHEMA,".",TABLE_NAME," CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_520_ci;")
FROM information_schema.TABLES
WHERE TABLE_SCHEMA="wp_project_name";
Setzt einfach in der letzten Zeile euren Datenbanknamen ein und führt den Befehl aus. Dann kopiert ihr euch die „generierten“ Queries und führt diese aus. Dabei könntet ihr eventuell einen Fehler wie den folgenden erhalten:
Invalid default value for 'comment_date'
In diesem Fall könntet ihr dann den sql_mode
temporär anpassen, indem ihr vor den ganzen ALTER TABLE
Statements die folgende Zeile einfügt:
SET sql_mode = '';
Nachdem ihr alle Statements ausgeführt habt sollten nun alle Tabellen die gleiche Kollation habe. In diesem Beispiel verwende ich die Kollation utf8mb4_unicode_520_ci
, auf eurem Server könnte es aber eine andere Variante sein.
Aktualisierung der Kollationen mit einem Plugin
Beim Schreiben dieses Beitrags bin ich über das Plugin Database Collation Fix gestoplert. Wenn ihr also keinen Zugriff auf eine Datenbank-Tool habt oder es such nicht zutraut, dann kann euch das Plugin dabei helfen. Der einzige „Nachteil“ ist, dass hier Tabellen nur in die Kollation utf8mb4_unicode_ci
(oder eine von drei Alternativen) nicht aber in die neuere utf8mb4_unicode_520_ci
Kollation konvertiert wird. Das sollte aber in der Regel kein Problem darstellen.
Fazit
Auch nach vielen Jahren Arbeit mit WordPress gibt es noch immer Fehler, die mir zuvor noch nicht untergekommen sind. In diesem Fall ist es nicht einmal ein spezifisches WordPress-Problem, aber da WordPress nicht sehr streng beim Umgang mit Kollationen ist, kann das Problem wohl häufiger mal auftreten. Vor allem dann, wenn die Installation schon etwas älter ist (beispielsweise vor Version 4.2.0 installiert). Wenn ihr also einen ähnlichen Fehler bei euch im Logfile findet, dann habt ihr jetzt hoffentlich eine Idee bekommen, wie ihr es lösen könnt. Und falls ihr schon lange nicht mehr in die Logfiles gesehen habt, dann ist diese Blogbeitrag vielleicht eine Erinnerung, das mal wieder zu tun.