too specified long length bytes mysql utf8mb4

mysql - specified - laravel 767 bytes



MySQL VARCHAR(255) UTF8 es demasiado largo para la clave, pero la longitud máxima es 1000 bytes (3)

Cualquier persona que necesite una longitud de clave mayor debería mirar innodb_large_prefix

visite http://dev.mysql.com/doc/refman/5.5/en/innodb-parameters.html#sysvar_innodb_large_prefix

Sé que ha habido muchas preguntas sobre esto, pero creo que mi matemática es correcta.

  • MySQL reserva 3 bytes por carácter UTF8.
  • MyISAM permite claves de longitud 1000 bytes.
  • Mi UTF8 VARCHAR (255) debe ser 255 * 3 = 765 bytes

A menos que UNQUE requiera un extra de más de 200 bytes por entrada, ¿por qué no funciona?

mysql> ALTER TABLE entry ADD UNIQUE INDEX (name(255)); ERROR 1071 (42000): Specified key was too long; max key length is 1000 bytes

¿Hay algo que pueda hacer al respecto?

EDITAR:

Resulta que el límite es 250. Parece que los caracteres de caracteres cuentan como 4 bytes para índices únicos, pero no sé por qué.

EDICION 2:

Gracias Vladislav Vaintroub, el juego de caracteres es de hecho utf8mb4. Eso resuelve el misterio. No había visto ninguna documentación sobre este cambio.

Supongo que construye el índice no único al truncar implícitamente el campo, lo cual es inaceptable para índices únicos, por lo que se niega.

Si vuelves a ingresar tu comentario como respuesta, me gustaría aceptarlo.

Solución: especifique utf8, no utf8mb4 (MySQL Admin no permite esto, así que cree la tabla manualmente)


MySQL reserva la cantidad máxima para un campo UTF8 que es de 4 bytes, por eso es que soplan más allá del límite de 1000 bytes. Mi recomendación es crear el varchar a menos de 255 o crearlo sin UTF8.

Ambas soluciones probablemente no sean adecuadas para usted o ya lo habría intentado.

La única otra solución que puedo pensar es dividir la columna en 2 columnas pequeñas y crear un índice único en ambos campos, pero creo que obtendría el mismo error que el anterior.

Ya que probablemente necesite UTF8, consideraría seriamente reducir la columna varchar (255) a un poco menos a 250 (o 249) para que esto funcione.


Si está usando utf8mb4 y tiene índices únicos en columnas varchar que tienen más de 191 caracteres de longitud, deberá activar innodb_large_prefix para permitir columnas más grandes en los índices, ya que utf8mb4 requiere más espacio de almacenamiento que utf8 o latin1. . Agregue lo siguiente a su archivo my.cnf.

[mysqld] innodb_file_format=barracuda innodb_file_per_table=1 innodb_large_prefix=1 init_connect=''SET collation_connection = utf8mb4_unicode_ci'' init_connect=''SET NAMES utf8mb4'' character-set-server=utf8mb4 collation-server=utf8mb4_unicode_ci

Más información sobre el por qué y el futuro de la documentación de MySQL 5.7 :

Si innodb_large_prefix está habilitado (el predeterminado en MySQL 5.7.7), el límite del prefijo de la clave del índice es 3072 bytes para las tablas InnoDB que usan el formato de filas DYNAMIC o COMPRESSED. Si innodb_large_prefix está deshabilitado, el límite de prefijo de clave de índice es de 767 bytes para las tablas de cualquier formato de fila.

innodb_large_prefix está en desuso en MySQL 5.7.7 y se eliminará en una versión futura. innodb_large_prefix se introdujo en MySQL 5.5 para deshabilitar los prefijos de clave de índice grande para compatibilidad con versiones anteriores de InnoDB que no admiten prefijos de clave de índice grande.

En resumen, el límite solo existe para la compatibilidad y se incrementará en versiones futuras.