too specified longitud long length larga demasiado declaracion clave bytes mysql sql ruby-on-rails indexing mysql-error-1071

specified - Mysql:: Error: la clave especificada era demasiado larga; la longitud máxima de la clave es 1000 bytes



phpmyadmin#1071-declaracion de clave demasiado larga. la maxima longitud de clave es 767 (5)

script/generate acts_as_taggable_on_migration rake db:migrate

causas

Mysql::Error: Specified key was too long; max key length is 1000 bytes: CREATE INDEX `index_taggings_on_taggable_id_and_taggable_type_and_context` ON `taggings` (`taggable_id`, `taggable_type`, `context`)

¿Que debería hacer?

Aquí está mi codificación de base de datos:

mysql> SHOW VARIABLES LIKE ''character/_set/_%''; +--------------------------+--------+ | Variable_name | Value | +--------------------------+--------+ | character_set_client | latin1 | | character_set_connection | latin1 | | character_set_database | utf8 | | character_set_filesystem | binary | | character_set_results | latin1 | | character_set_server | latin1 | | character_set_system | utf8 | +--------------------------+--------+ 7 rows in set (0.00 sec)


Creo que uno de tus campos es un varchar con más de 1000 caracteres. por ejemplo, contexto?

Piensa en el significado de un índice. Es un acceso rápido a una fila cuando todos sus campos indexados están dentro de la cláusula where. Si un índice es largo (en el caso de mysql más de 1000 bytes), no tiene sentido usar un índice, porque probablemente sea más lento que acceder a la tabla completa con un escaneo completo de la tabla.

Sugeriría acortar el índice, por ejemplo, a taggable_id y taggable_type, si esos dos son más cortos una vez.

Saludos - Gerhard


Esto es solo un problema de MySQL -

MySQL tiene diferentes motores: MyISAM, InnoDB, Memory ...

MySQL tiene diferentes límites en la cantidad de espacio que puede usar para definir índices en columna (s); para MyISAM es de 1,000 bytes; es 767 para InnoDB . Y el tipo de datos de esas columnas es importante: para VARCHAR, es 3 veces, por lo que un índice en un VARCHAR (100) tomará 300 de esos bytes (porque 100 caracteres * 3 = 300).

Para acomodar cierta indexación cuando alcanza el valor máximo, puede definir el índice con respecto a porciones del tipo de datos de columna:

CREATE INDEX example_idx ON YOUR_TABLE(your_column(50))

Suponiendo que your_column es VARCHAR (100), el índice en el ejemplo anterior solo estará en los primeros 50 caracteres. La búsqueda de datos más allá del personaje número 50 no podrá usar el índice.


Esto parece ser un error que se informó aquí: http://bugs.mysql.com/bug.php?id=4541

Si ha intentado todas las respuestas en esta publicación y sigue recibiendo el error, puede intentar ejecutar este comando en su ventana de consulta SQL.

set GLOBAL storage_engine=''InnoDb'';


Tuve este problema, así que mi solución fue esta:

alter table robs_temp.missing_email change email email varchar(300); ALTER TABLE robs_temp.missing_email add primary key (email); -- Now it works.

Según Wikipedia, los correos electrónicos válidos no pueden tener más de 256 caracteres. Quizás sus datos tengan algún límite superior.


si este error ocurre en algún proceso como migración, podría resolverse cambiando el archivo de configuración de MySql (* .ini)

default-storage-engine=InnoDB