Error de MySQL n.º 1071: la clave especificada era demasiado larga; La longitud máxima de la clave es 767 bytes.

Resuelto Steven asked hace 14 años • 37 respuestas

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
Steven avatar Nov 29 '09 10:11 Steven
Aceptado

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 varcharcampo grande que está utf8mb4codificado, 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 utf8mb4carácter es de cuatro bytes. Para un utf8cará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 VARCHARcampos.

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. .

OMG Ponies avatar Nov 29 '2009 03:11 OMG Ponies

Cuando llegas al límite. Establezca lo siguiente.

  • INNODButf8 VARCHAR(255)
  • INNODButf8mb4 VARCHAR(191)
Aley avatar Jul 17 '2015 11:07 Aley