MySQL VARCHAR (255) UTF8 ist zu lang für Schlüssel, aber maximale Länge ist 1000 Bytes
Ich weiß, es wurden viele Fragen zu diesem Thema, aber ich denke, dass meine Mathe richtig ist.
- MySQL behält sich 3 Byte pro UTF8-Zeichen.
- InnoDB erlaubt Schlüssel der Länge 1000 bytes.
- Meine UTF8 VARCHAR(255) sollte werden
255 * 3 = 765
bytes
Es sei denn, UNQUE erfordert eine zusätzliche 200+ Byte pro Eintrag, warum funktioniert das nicht?
mysql> ALTER TABLE entry ADD UNIQUE INDEX (name(255));
ERROR 1071 (42000): Specified key was too long; max key length is 1000 bytes
Kann ich irgendetwas dagegen tun?
EDIT:
Es stellt sich heraus, ist die Grenze 250. Es scheint chars zählen als 4 bytes für eindeutige Indizes, aber ich weiß nicht, warum.
EDIT 2:
Dank Vladislav Vaintroub, das charset ist in der Tat utf8mb4. Das löst das Rätsel. Ich hatte nicht gesehen, dass jegliche Dokumentation, die auf dieser änderung.
Ich vermute, es baut die non unique index implizit mit dem abschneiden von Feld, was nicht hinnehmbar ist für eindeutige Indizes, so dass es sich weigert.
Wenn Sie re-geben Sie Ihren Kommentar als eine Antwort wäre ich glücklich, es zu akzeptieren.
Lösung: Geben Sie utf8, nicht utf8mb4 (MySQL-Admin nicht erlauben, so erstellen Sie die Tabelle manuell)
InformationsquelleAutor der Frage David Kanarek | 2011-05-30
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wenn Sie mit utf8mb4, und Sie haben eindeutige Indizes auf varchar-Spalten, die größer als 191 Zeichen in der Länge, die Sie benötigen, um wiederum auf innodb_large_prefix zu erlauben, für größere Spalten in Indizes, weil utf8mb4 erfordert mehr Speicherplatz als utf-8 oder latin1. Fügen Sie den folgenden, um Ihr meine.cnf-Datei.
Mehr Infos über das warum und die Zukunft von MySQL 5.7 Dokumentation:
Zusammenfassend ist zu sagen, die Grenze ist nur dort für Kompatibilität und erhöht sich in zukünftigen Versionen.
InformationsquelleAutor der Antwort jsears
Wer benötigt einen größeren Schlüssellänge sollte einen Blick auf innodb_large_prefix
besuchen http://dev.mysql.com/doc/refman/5.5/en/innodb-parameters.html#sysvar_innodb_large_prefix
InformationsquelleAutor der Antwort Omesh
MySQL behält sich die max Höhe für den utf-8-Feld 4 bytes, so dass ist, warum Sie weht vorbei an der 1000-byte-Grenze. Meine Empfehlung ist die Schaffung von varchar auf weniger als 255 oder schaffen es ohne UTF8.
Diese beiden Lösungen sind wohl nicht das richtige für Sie oder Sie hätte bereits versucht.
Die einzige andere Lösung, die ich denken kann, ist split die Spalte in 2 kleine Spalten und erstellen Sie einen eindeutigen index über beide Felder, aber ich glaube, Sie würde den gleichen Fehler wie oben.
Da Sie wahrscheinlich benötigen, UTF8, ich würde ernsthaft betrachten Reduzierung der varchar(255) - Spalte ein wenig nach unten auf 250 (oder 249) um diese Arbeit zu machen.
InformationsquelleAutor der Antwort JohnL