Je sais que les questions portant ce titre ont déjà reçu une réponse, mais continuez à lire. J'ai lu attentivement toutes les autres questions / réponses sur cette erreur avant de poster.
J'obtiens l'erreur ci-dessus pour la requête suivante:
CREATE TABLE IF NOT EXISTS `pds_core_menu_items` (
`menu_id` varchar(32) NOT NULL,
`parent_menu_id` int(32) unsigned DEFAULT NULL,
`menu_name` varchar(255) DEFAULT NULL,
`menu_link` varchar(255) DEFAULT NULL,
`plugin` varchar(255) DEFAULT NULL,
`menu_type` int(1) DEFAULT NULL,
`extend` varchar(255) DEFAULT NULL,
`new_window` int(1) DEFAULT NULL,
`rank` int(100) DEFAULT NULL,
`hide` int(1) DEFAULT NULL,
`template_id` int(32) unsigned DEFAULT NULL,
`alias` varchar(255) DEFAULT NULL,
`layout` varchar(255) DEFAULT NULL,
PRIMARY KEY (`menu_id`),
KEY `index` (`parent_menu_id`,`menu_link`,`plugin`,`alias`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
Quelqu'un a-t-il une idée pourquoi et comment y remédier? Le hic est que cette même requête fonctionne parfaitement sur ma machine locale, et a également fonctionné sur mon hôte précédent. Btw.it vient d'un projet mature - phpdevshell - donc je suppose que ces gars savent ce qu'ils font, bien que vous ne le sachiez jamais.
Tout indice apprécié.
J'utilise phpMyAdmin.
la source
Cette erreur signifie que la longueur de l'index
index
est supérieure à 1000 octets. MySQL et les moteurs de stockage peuvent avoir cette restriction. J'ai eu une erreur similaire sur MySQL 5.5 - «La clé spécifiée était trop longue; la longueur maximale de la clé est de 3072 octets lors de l'exécution de ce script:UTF8 est multi-octets, et la longueur de clé est calculée de cette manière - 500 * 3 * 6 = 9000 octets.
Mais notez que la prochaine requête fonctionne!
... parce que j'ai utilisé CHARSET = latin1, dans ce cas, la longueur de la clé est de 500 * 6 = 3000 octets.
la source
J'ai eu ce problème et je l'ai résolu en suivant:
Référence
la source
exécutez cette requête avant de créer ou de modifier la table.
SET @@global.innodb_large_prefix = 1;
cela définira la longueur maximale de la clé à 3072 octets
la source
Cette limite de taille d'index semble être plus grande sur les versions 64 bits de MySQL.
J'atteignais cette limitation en essayant de vider notre base de données de développement et de la charger sur un VMWare local virt. Finalement, j'ai réalisé que le serveur de développement distant était 64 bits et j'avais créé un virt 32 bits. Je viens de créer un virt 64 bits et j'ai pu charger la base de données localement.
la source
Je viens de contourner cette erreur en changeant simplement les valeurs de la "longueur" dans la base de données d'origine au total d'environ "1000" en modifiant sa structure, puis en exportant la même chose vers le serveur. :)
la source
J'étais confronté au même problème, utilisé ci-dessous la requête pour le résoudre.
Lors de la création de DB, vous pouvez utiliser l'encodage utf-8
par exemple.
create database my_db character set utf8 collate utf8mb4;
EDIT: (Compte tenu des suggestions des commentaires) Changement de utf8_bin en utf8mb4
la source
utf8
n'est PASutf8
, c'est un format propriétaire bogué qui n'aurait jamais dû se concrétiser.utf8mb4
est vraiutf8
et est la valeur par défaut recommandée pour uneutf8
prise en charge appropriée .utf8mb4
est le bon encodage à utiliser sur mysql et nonutf8