Quand je lance un programme qui fait quelque chose avec MySQL, j'ai ce message d'erreur:
2015-06-10 15: 41: 12,250 ERREUR app.wsutils 419 INCRON: erreur: ('HY000', '[HY000] [MySQL] [Pilote ODBC 5.2 (w)] [mysqld-5.7.7-rc -log] La taille maximale de la colonne d'index est trop grande. La taille maximale de la colonne est de 767 octets (1709) (SQLExecDirectW) ')
Je googlé un peu, et a trouvé cette erreur pourrait être liée à l'option innodb_large_prefix
. Cependant, j'utilise MySQL 5.7.7 rc, qui a déjà défini innodb_large_prefix
sur "ON" (vérifié dans MySQL Workbench), autorisant jusqu'à 3072 octets. Je ne suis pas sûr que ce soit le problème avec innodb_large_prefix
ou non.
Quoi qu'il en soit, quelqu'un a-t-il une idée de la façon de résoudre ce problème?
La colonne que vous essayez d'indexer est trop volumineuse et vos paramètres ne doivent pas être corrects pour innodb_large_prefix
. Il existe quelques prérequis paramètres qui doivent également être définis pour que innodb_large_prefix
fonctionne correctement.
Vous pouvez vérifier que innodb_large_prefix est défini en exécutant:
show global variables like 'innodb_lar%';
Voici quelques prérequis à l’utilisation de innodb_large_prefix:
Vous devez définir votre variable globale innodb_file_format = BARRACUDA
pour vérifier les paramètres, lancez: show global variables like 'innodb_fil%';
Au niveau de la table, vous devez utiliser ROW_FORMAT = DYNAMIC ou ROW_FORMAT = COMPRESSED
pour Innodb , les lignes sont stockées au format COMPACT (ROW_FORMAT = COMPACT) par défaut.
À l'aide de la réponse donnée par BK435, j'ai procédé comme suit et résolu le problème.
set global innodb_file_format = BARRACUDA;
set global innodb_large_prefix = ON;
create table test (........) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC;
J'ai eu la même erreur malgré le fait que innodb_large_prefix
soit configuré correctement.
Le problème était en collation utilisée. Le classement par défaut de ma base de données était défini sur utf8mb4_bin
(vous pouvez le vérifier dans l'onglet "Opérations" de phpmyadmin pour la base de données). Cela signifie qu'il utilise 4 octets par caractère, alors que le classement utf8 (par exemple, utf8_unicode_ci) utilise 3 octets par caractère.
dans ce cas, vous pouvez soit utiliser un autre classement, par exemple. en ajoutant DEFAULT CHARSET=utf8
à la fin de l'instruction CREATE TABLE
ou en limitant la taille de l'index en n'utilisant qu'une partie de la valeur de la colonne .__, comme KEY 'identifier' (column1(5),column2(10))
.
Voir également la question connexe: # 1071 - La clé spécifiée était trop longue; La longueur maximale de la clé est de 767 octets
J'ai eu ce problème parce que j'ai essayé de créer une clé primaire String avec varchar (254). Facile à négliger parfois .. Alors vérifiez bien votre type d’index et sa longueur aussi :)
Dans mon cas (MySQL version 5.6), le problème était que j'essayais de créer une table avec une colonne pouvant contenir jusqu'à 256 caractères (la base de données utilise un classement utf8), donc 3 octets par 1 caractère utf8 = 256 * 3 = 768 octets. Le correctif était simplement d'avoir 255 caractères au lieu de 256.
Je pouvais aussi définir innodb_large_prefix, comme le suggèrent d’autres, mais dans mon cas, il était plus simple d’avoir moins de symboles.