767 Bytes in MySQL Version 5.6 (und frühere Versionen), ist die angegebene Präfixbegrenzung für InnoDB-Tabellen. Für MyISAM-Tabellen ist sie 1.000 Byte lang. Diese Grenze wurde erhöht auf 3072 Bytes In MySQL Version 5.7 (und aufwärts).
Sie müssen sich auch bewusst sein, dass, wenn Sie einen Index auf ein großes Zeichen oder varchar
Feld, das utf8mb4
kodiert ist, müssen Sie die maximale Länge des Indexpräfixes von 767 Byte (oder 3072 Byte) durch 4 teilen, was zu 191 . Dies liegt daran, dass die maximale Länge einer utf8mb4
Zeichen sind vier Bytes. Für ein utf8
Zeichen wären es drei Bytes, was eine maximale Länge des Indexpräfixes von 255 (oder minus Null-Terminator, 254 Zeichen).
Eine Möglichkeit, die Sie haben, ist, einfach eine Untergrenze für Ihre VARCHAR
Felder.
Eine weitere Möglichkeit (nach der Antwort auf diese Frage ) ist es, die Teilmenge der Spalte und nicht den gesamten Betrag zu erhalten, d.h.:
ALTER TABLE `mytable` ADD UNIQUE ( column1(15), column2(200) );
Ändern Sie die Einstellungen so, wie Sie es brauchen, um den Schlüssel anzuwenden, aber ich frage mich, ob es sich lohnen würde, Ihr Datenmodell in Bezug auf diese Entität zu überprüfen, um zu sehen, ob es Verbesserungen gibt, die es Ihnen ermöglichen würden, die beabsichtigten Geschäftsregeln zu implementieren, ohne auf die MySQL-Beschränkung zu stoßen.
5 Stimmen
Da es sich nicht um 520 Bytes, sondern um 2080 Bytes handelt, die weit über 767 Bytes hinausgehen, könnten Sie Spalte1 varchar(20) und Spalte2 varchar(170) verwenden. Wenn Sie eine Zeichen/Byte-Entsprechung wünschen, verwenden Sie latin1
3 Stimmen
Ich denke, Ihre Berechnung ist ein bisschen falsch hier. mysql verwendet 1 oder 2 zusätzliche Bytes, um die Werte Länge aufzeichnen: 1 Byte, wenn die maximale Länge der Spalte 255 Bytes oder weniger ist, 2, wenn es länger als 255 Bytes ist. die utf8_general_ci Codierung benötigt 3 Bytes pro Zeichen so varchar (20) verwendet 61 Bytes, varchar (500) verwendet 1502 Bytes insgesamt 1563 Bytes
3 Stimmen
Mysql> select maxlen, character_set_name from information_schema.character_sets where character_set_name in('latin1', 'utf8', 'utf8mb4'); maxlen | character_set_name ------ | ------------------- 1 | latin1 ------ | ------------------- 3 | utf8 ------ | ------------------- 4 | utf8mb4
24 Stimmen
'wenn Sie eine Zeichen/Byte-Äquivalenz wünschen, verwenden Sie latin1' Bitte Tun Sie das nicht . Latin1 ist wirklich, wirklich scheiße. Du wirst es bereuen.
0 Stimmen
Siehe stackoverflow.com/a/52778785/2137210 für die Lösung