Wenn ich den folgenden Befehl ausführe:
ALTER TABLE `mytable` ADD UNIQUE (
`column1` ,
`column2`
);
Ich habe diese Fehlermeldung erhalten:
#1071 - Specified key was too long; max key length is 767 bytes
Informationen über Spalte1 und Spalte2:
column1 varchar(20) utf8_general_ci
column2 varchar(500) utf8_general_ci
でしょう varchar(20)
benötigt nur 21 Bytes, während varchar(500)
benötigt nur 501 Bytes. Die Gesamtzahl der Bytes beträgt also 522, also weniger als 767. Warum habe ich dann die Fehlermeldung erhalten?
#1071 - Specified key was too long; max key length is 767 bytes
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