db Fehlermeldung 1709 Index column size too large. The maximum column size is 767 bytes

Diese Meldung sieht man häufig nach einem Update (auf die Version 3.5), und zwar an der Stelle, wo alle db-Tabellen auf utf8mb4 (= Multibyte) umgestellt werden sollen.

Der Grund dafür ist der: Mit der Version 3.5 stellt Joomla alle Core-Tabellen auf utf8mb4 um, sodass ein einzelnes Zeichen (Charakter) neu nicht mehr 3 Bytes, sondern 4 Bytes Speicherplatz in der db belegt. Die normalen Einstellungen der Datenbanken gehen aber daon aus, dass z.B. der Primärschlüssel einer Tabelle höchstens 767 Bytes lang sein darf (das wären 255 Bytes, die db selbst benötigt 1-2 Bytes für die Verwaltung). Damit sind plötzlich einige der Felder zu klein. Häufig möchte Joomla 255 Bytes für einen Schlüssel belegen.

Bei UTF-8 gilt: Jedes Zeichen belegt 3 Byte,  also 3*255 = 765 < 767
Bei UTF8mb4 gilt: Jedes Zeichen belegt 4 Byte,  also 4*255 = 1020 > 767


Die Tabelle zeigt den Zusammenhang:

 Charaktersatz    Bytes/Char 
 Max. Charakter
 utf8  3 Bytes  255
 utf8mb4  4 Bytes  191
 latin1  1 Byte  767

Abhilfe schafft folgendes Vorgehen:
In phpMyAdmin schaut man unter dem Tab 'Variablen' (auf der Home-Seite der db Verwaltung, nicht in einer einzelnen Datenbank!), ob folgende Variablen gesetzt sind:

innodb default row format = dynamic
innodb large prefix = ON
innodb default row format = dynamic / compressed

Sind diese Variablen richtig  gesetzt, kann man sich daran machen, die angemotzten Tabellen in phpMyAdmin wie folgt zu ändern:

ALTER TABLE [tablename] ROW_FORMAT=DYNAMIC;

[tablename] ist durch den Tabellenname zu ersetzen (inklusive Präfix).

Die Änderung bewirkt, dass man plötzlich sehr viel mehr Platz in den Tabellenzellen bekommt:

 Charaktersatz  Bytes/Char  Max. Charakter
 utf8  3 Bytes  21845
 utf8mb4  4 Bytes  16384
 latin1  1 Byte  65536