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 |