Dieses Problem trat auf, als versucht wurde, einem VARCHAR (255) -Feld mit utf8mb4 einen EINZIGARTIGEN Index hinzuzufügen. Während das Problem hier bereits gut umrissen ist, wollte ich einige praktische Ratschläge hinzufügen, wie wir dies herausgefunden und gelöst haben.
Bei Verwendung von utf8mb4 zählen Zeichen als 4 Bytes, während sie unter utf8 als 3 Bytes gelten können. InnoDB-Datenbanken haben ein Limit, dass Indizes nur 767 Bytes enthalten dürfen. Wenn Sie utf8 verwenden, können Sie 255 Zeichen (767/3 = 255) speichern. Mit utf8mb4 können Sie jedoch nur 191 Zeichen (767/4 = 191) speichern.
VARCHAR(255)
Mit utf8mb4 können Sie durchaus reguläre Indizes für Felder hinzufügen. Die Indexgröße wird jedoch automatisch auf 191 Zeichen gekürzt - wie unique_key
hier:
Dies ist in Ordnung, da reguläre Indizes nur verwendet werden, um MySQL dabei zu unterstützen, Ihre Daten schneller zu durchsuchen. Das gesamte Feld muss nicht indiziert werden.
Warum schneidet MySQL den Index für reguläre Indizes automatisch ab, gibt jedoch einen expliziten Fehler aus, wenn Sie versuchen, dies für eindeutige Indizes zu tun? Damit MySQL herausfinden kann, ob der eingefügte oder aktualisierte Wert bereits vorhanden ist, muss der gesamte Wert indiziert werden und nicht nur ein Teil davon.
Wenn Sie am Ende des Tages einen eindeutigen Index für ein Feld haben möchten, muss der gesamte Inhalt des Felds in den Index passen. Für utf8mb4 bedeutet dies, dass Sie Ihre VARCHAR-Feldlängen auf 191 Zeichen oder weniger reduzieren. Wenn Sie für diese Tabelle oder dieses Feld nicht utf8mb4 benötigen, können Sie es auf utf8 zurücksetzen und Ihre Felder mit einer Länge von 255 behalten.