L'erreur se produit parce que MySQL ne peut indexer que les premiers caractères N d'une colonne BLOB ou TEXT
. Ainsi, l'erreur se produit principalement lorsqu'il y a un champ/colonne de type TEXT
ou BLOB ou ceux appartenant aux types TEXT
ou BLOB
tels que TINYBLOB
, MEDIUMBLOB
, LONGBLOB
, TINYTEXT
, MEDIUMTEXT
et LONGTEXT
que vous essayez de définir comme clé primaire ou index. Avec un BLOB
ou TEXT
complet sans la valeur de longueur, MySQL ne peut garantir l'unicité de la colonne car sa taille est variable et dynamique. Ainsi, lors de l'utilisation des types BLOB
ou TEXT
en tant qu'index, la valeur de N doit être fournie afin que MySQL puisse déterminer la longueur de la clé. Cependant, MySQL ne prend pas en charge une limite de longueur de clé sur TEXT
ou BLOB
. TEXT(88)
ne fonctionnera tout simplement pas.
L'erreur apparaîtra également lorsque vous essayez de convertir une colonne de table d'un type non-TEXT
et non-BLOB
comme VARCHAR
et ENUM
en un type TEXT
ou BLOB
, la colonne étant déjà définie comme contraintes uniques ou index. La commande SQL Alter Table échouera.
La solution au problème est de supprimer la colonne TEXT
ou BLOB
de l'index ou de la contrainte unique ou de définir un autre champ comme clé primaire. Si vous ne pouvez pas le faire et que vous souhaitez imposer une limite à la colonne TEXT
ou BLOB
, essayez d'utiliser le type VARCHAR
et d'imposer une limite de longueur dessus. Par défaut, VARCHAR
est limité à un maximum de 255 caractères et sa limite doit être spécifiée implicitement dans une parenthèse juste après sa déclaration, c'est-à-dire que VARCHAR(200)
le limitera à 200 caractères seulement.
Parfois, même si vous n'utilisez pas de type lié à TEXT
ou BLOB
dans votre table, l'Erreur 1170 peut également apparaître. Cela se produit dans une situation telle que lorsque vous spécifiez une colonne VARCHAR
comme clé primaire, mais que vous définissez incorrectement sa longueur ou sa taille de caractères. VARCHAR
ne peut accepter que jusqu'à 256 caractères, donc toute chose telle que VARCHAR(512)
forcera MySQL à convertir automatiquement VARCHAR(512)
en un type de données SMALLTEXT
, ce qui échouera ensuite avec l'erreur 1170 sur la longueur de la clé si la colonne est utilisée comme clé primaire ou index unique ou non unique. Pour résoudre ce problème, spécifiez une taille inférieure à 256 pour le champ VARCHAR
.
Référence : Erreur MySQL 1170 (42000) : colonne BLOB/TEXT utilisée dans la spécification de clé sans longueur de clé
10 votes
Une table ne peut pas avoir plusieurs clés primaires. Voulez-vous dire qu'elle a une clé primaire composite (c'est-à-dire incluant plus d'une colonne) ou qu'elle a plusieurs clés
UNIQUE
?1 votes
Dans mon cas, pour une raison quelconque, j'avais un type TEXT pour une colonne d'e-mail au lieu de VARCHAR.
2 votes
Utilisez VARCHAR pour alphanumérique unique.