Anomalie #4342
Erreur 1071 de mysql: Specified key was too long; max key length is 1000 bytes
0%
Description
Bonjour,
Après avoir configuré MariaDB pour être en UTF8MB4, je n'ai pas pu installer un plugin (comme il y a aussi un bug SVP, je vais faire un autre ticket spécifique).
Pour être précis, un table du plugin n'a pas été créée et sql.log contient :
2019-05-25 16:23:59 78.205.175.37 (pid 16091) :Pri:ERREUR: Erreur 1071 de mysql: Specified key was too long; max key length is 1000 bytes in ecrire/base/create.php L73 [sql_create(),creer_ou_upgrader_table(),alterer_base(),maj_tables(),serie_alter(),maj_while(),maj_plugin(),referer_spam_upgrade(),spip_plugin_install(),plugins_installer_dist(),installer_plugin(),do_install(),do_action(),one_action(),action_actionner_dist(),traiter_appels_actions()] CREATE TABLE IF NOT EXISTS `mutu_pro2spipf126`.spip_referer_spam ( date DATE NOT NULL, referer VARCHAR (255) , PRIMARY KEY (referer)) ENGINE=MyISAM
La documentation sur ce sujet est abondante.
Ceci m'a semblé un bon résumé du problème : https://stackoverflow.com/questions/6172798/mysql-varchar255-utf8-is-too-long-for-key-but-max-length-is-1000-bytes
Et la solution générale consiste à faire un index de seulement 191 : https://dev.mysql.com/doc/refman/5.7/en/charset-unicode-conversion.html :
In an InnoDB table that uses COMPACT or REDUNDANT row format, these column and index definitions are legal: col1 VARCHAR(500) CHARACTER SET utf8, INDEX (col1(255)) To use utf8mb4 instead, the index must be smaller: col1 VARCHAR(500) CHARACTER SET utf8mb4, INDEX (col1(191))
History
#1
Updated by RealET 🔸 almost 2 years ago
Voir #4343 pour le bug spécifique SVP
#2
Updated by b b over 1 year ago
- Status changed from Nouveau to En cours
Comme indiqué plus bas dans le thread que tu pointes, ton problème vient du fait que tu utilises MyISAM et non InnoDB cf https://stackoverflow.com/a/50689604
J'hésite à répondre que c'est un bug de configuration de ton serveur SQL ou du plugin en question...
#3
Updated by RealET 🔸 over 1 year ago
Puisque tu parles de InoDB : Il n'est pas possible en l'état d'utilise SPIP avec InoDB : il force MyISAM...
Et #4277 fourni le patch pour résoudre ça (et fonctionne en production sur l'Académie de Rennes)
#4
Updated by b b over 1 year ago
- Status changed from En cours to Fermé
- Resolution set to invalid
Évitons de digresser, on ferme :)
#5
Updated by cam.lafit - 11 months ago
- Status changed from Fermé to En cours
Salut
Je me permets de réouvrir ce ticket. Si on migre un vieux site sur un nouveau serveur. L'export SQL va indiquer le moteur MyIsam.
Si par la suite on souhaite monter de version on tomber sur l'erreur des index trop courts. Cette erreur est silencieuse et le site se mets à jour sans dire qu'il a un planté.
Sur une migration 1.9.2 vers 3.2, la mise à jour plante sur spip_urls et spip_index qui utilise ce type d'index.
Il serait bon de faire un contrôle amont pour vérifier que spip pourra se mettre à jour.
#6
Updated by RealET 🔸 11 months ago
Une autre piste donnée par b_b sur IRC :
- 767 octets est la limite de préfixe déclaré pour les tables InnoDB dans les versions antérieures à la 5.7 de MySQL et dans les versions antérieurs à la 10.2 de MariaDB.
- A partir de la version 5.7 de MySQL et la 10.2 de MariaDB, cette limite a été augmentée à 3072 octets.
=> bingo on est en 10.1.41-MariaDB-1~stretch
- L’encodage (latin1, UTF8, UTF8mb4, etc.) peut jouer sur cette taille. Puisqu’en UTF8 un caractère prend 3 octets, il faut diviser la taille disponible par 3 pour trouver la longueur maximale de préfixe d’index. Et par 4 si on utilise UTF8mb4.
=> re bingo on est en utf8
Une piste ici :
global.innodb_large_prefix = 1
https://stackoverflow.com/a/22873006
https://github.com/go-gitea/gitea/issues/2979#issuecomment-412607116
https://answers.launchpad.net/maria/+question/241612
Amha c'est l'option qu'il nous faut tant qu'on est pas en mariadb > 10.1, sinon il faut passer en mariadb 10.3 cf :
https://github.com/go-gitea/gitea/issues/2979#issuecomment-421000381
PS : j'utilise mariadb 10.3 en local et je n'ai pas ce problème.