Error de MySQL n.º 1071: la clave especificada era demasiado larga; La longitud máxima de la clave es 767 bytes.
Cuando ejecuté el siguiente comando:
ALTER TABLE `mytable` ADD UNIQUE (
`column1` ,
`column2`
);
Recibí este mensaje de error:
#1071 - Specified key was too long; max key length is 767 bytes
Información sobre la columna1 y la columna2:
column1 varchar(20) utf8_general_ci
column2 varchar(500) utf8_general_ci
Creo que varchar(20)
solo requiere 21 bytes, mientras que varchar(500)
solo requiere 501 bytes. Entonces, el total de bytes es 522, menos de 767. Entonces, ¿por qué recibí el mensaje de error?
#1071 - Specified key was too long; max key length is 767 bytes
767 bytes en MySQL versión 5.6 (y versiones anteriores) es la limitación de prefijo indicada para las tablas InnoDB. Tiene una longitud de 1000 bytes para las tablas MyISAM. Este límite se ha incrementado a 3072 bytes en MySQL versión 5.7 (y superiores).
También debe tener en cuenta que si establece un índice en un carácter o varchar
campo grande que está utf8mb4
codificado, debe dividir la longitud máxima del prefijo del índice de 767 bytes (o 3072 bytes) entre 4, lo que da como resultado 191 . Esto se debe a que la longitud máxima de un utf8mb4
carácter es de cuatro bytes. Para un utf8
carácter, serían tres bytes, lo que daría como resultado una longitud máxima de prefijo de índice de 255 (o menos el terminador nulo, 254 caracteres).
Una opción que tiene es simplemente colocar un límite inferior en sus VARCHAR
campos.
Otra opción (según la respuesta a este problema ) es obtener el subconjunto de la columna en lugar del monto total, es decir:
ALTER TABLE `mytable` ADD UNIQUE ( column1(15), column2(200) );
Modifique según sea necesario para obtener la clave para aplicar, pero me pregunto si valdría la pena revisar su modelo de datos con respecto a esta entidad para ver si hay mejoras posibles, que le permitirían implementar las reglas comerciales previstas sin alcanzar la limitación de MySQL. .
Cuando llegas al límite. Establezca lo siguiente.
- INNODB
utf8
VARCHAR(255)
- INNODB
utf8mb4
VARCHAR(191)