Erreur 1071 de mysql: Specified key was too long; max key length is 1000 bytes
#4342
Open
opened 3 years ago by RealET
·
19 comments
No Branch/Tag Specified
1.8
1.9.1
1.9.2
2.0
2.1
3.0
3.1
3.2
4.0
4.1
boutons-danger
debug_ecrire_fichier
dev-sortable
dev/autoloader
dev/instituer_ergo
dev_infos_image
fix/valider_url_distante
fix_modifier_login
issue_4101
issue_4678
issue_4705
issue_4717
issue_4946
issue_5016
issue_5056_composer_road
issue_5272_php_82
issue_5273
master
neversayoupsagain
refactor_texte_safety
v1.8.3+b
v1.9.1+i
v1.9.2+f
v1.9.2+g
v1.9.2+h
v1.9.2+i
v1.9.2+j
v1.9.2+k
v1.9.2+m
v1.9.2+n
v1.9.2+o
v1.9.2+p
v2.0.0
v2.0.1
v2.0.10
v2.0.11
v2.0.12
v2.0.13
v2.0.14
v2.0.15
v2.0.16
v2.0.17
v2.0.18
v2.0.19
v2.0.2
v2.0.20
v2.0.21
v2.0.22
v2.0.23
v2.0.24
v2.0.25
v2.0.26
v2.0.3
v2.0.5
v2.0.6
v2.0.7
v2.0.8
v2.0.9
v2.1.0
v2.1.1
v2.1.10
v2.1.11
v2.1.12
v2.1.13
v2.1.14
v2.1.15
v2.1.16
v2.1.17
v2.1.18
v2.1.19
v2.1.2
v2.1.20
v2.1.21
v2.1.22
v2.1.23
v2.1.24
v2.1.25
v2.1.26
v2.1.27
v2.1.28
v2.1.29
v2.1.3
v2.1.30
v2.1.4
v2.1.5
v2.1.6
v2.1.7
v2.1.8
v2.1.9
v3.0.0
v3.0.0-alpha.1
v3.0.0-beta
v3.0.0-beta.2
v3.0.0-rc
v3.0.1
v3.0.10
v3.0.11
v3.0.12
v3.0.13
v3.0.14
v3.0.15
v3.0.16
v3.0.17
v3.0.18
v3.0.19
v3.0.2
v3.0.20
v3.0.21
v3.0.22
v3.0.23
v3.0.24
v3.0.25
v3.0.26
v3.0.27
v3.0.28
v3.0.3
v3.0.4
v3.0.5
v3.0.6
v3.0.7
v3.0.8
v3.0.9
v3.1.0
v3.1.0-alpha
v3.1.0-beta
v3.1.0-rc
v3.1.0-rc.2
v3.1.0-rc.3
v3.1.1
v3.1.10
v3.1.11
v3.1.12
v3.1.13
v3.1.14
v3.1.15
v3.1.2
v3.1.3
v3.1.4
v3.1.5
v3.1.6
v3.1.7
v3.1.8
v3.1.9
v3.2-alpha.1
v3.2.0
v3.2.0-alpha.1
v3.2.0-beta
v3.2.0-beta.2
v3.2.0-beta.3
v3.2.1
v3.2.10
v3.2.11
v3.2.12
v3.2.13
v3.2.14
v3.2.15
v3.2.16
v3.2.2
v3.2.3
v3.2.4
v3.2.5
v3.2.6
v3.2.7
v3.2.8
v3.2.9
v4.0.0
v4.0.0-alpha
v4.0.0-beta
v4.0.1
v4.0.2
v4.0.3
v4.0.4
v4.0.5
v4.0.6
v4.0.7
v4.0.8
v4.1.0
v4.1.0-alpha
v4.1.0-beta
v4.1.0-rc
v4.1.1
v4.1.2
v4.1.3
v4.1.4
v4.1.5
Labels
Amélioration, nouvelle fonctionnalité APIs authentification base de données bug
Ca ne fonctionne pas code généré compilo css divers documentation doublon
Ce ticket est un doublon ergonomie espace privé filtres et balises formulaires Inscription installation invalide
Ticket invalide javascript langues LDAP plugin PostgreSQL refusé
Ignoré, c'est comme Ca... sécurité traduction
Apply labels
Clear labels
accessibilité
amélioration
Amélioration, nouvelle fonctionnalité APIs authentification base de données bug
Ca ne fonctionne pas code généré compilo css divers documentation doublon
Ce ticket est un doublon ergonomie espace privé filtres et balises formulaires Inscription installation invalide
Ticket invalide javascript langues LDAP plugin PostgreSQL refusé
Ignoré, c'est comme Ca... sécurité traduction
No Label
accessibilité
amélioration
APIs
authentification
base de données
bug
code généré
compilo
css
divers
documentation
doublon
ergonomie
espace privé
filtres et balises
formulaires
Inscription
installation
invalide
javascript
langues
LDAP
plugin
PostgreSQL
refusé
sécurité
traduction
Milestone
Set milestone
Clear milestone
No items
No Milestone
Projects
Clear projects
No project
Assignees
Assign users
Clear assignees
No Assignees
7 Participants
Notifications
Due Date
The due date is invalid or out of range. Please use the format 'yyyy-mm-dd'.
No due date set.
Dependencies
This issue currently doesn't have any dependencies.
Reference in new issue
There is no content yet.
Delete Branch '%!s(MISSING)'
Deleting a branch is permanent. It CANNOT be undone. Continue?
No
Yes
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 :
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 :
Voir #4343 pour le bug spécifique SVP
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...
Statut changé à En cours
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)
Évitons de digresser, on ferme :)
Statut changé à Fermé
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.
Statut changé à En cours
Une autre piste donnée par b_b sur IRC :
https://florent.poinsaut.fr/2018/08/17/mysql-mariadb-index-column-size-too-large-the-maximum-column-size-is-767-bytes/ :
=> bingo on est en 10.1.41-MariaDB-1~stretch
=> 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.
Pour info, même problème avec la table spip_mailsubscribers et UNIQUE email (email(255))
Du coup c'est de la documentation, non ?
Version cible mise à 4.0
Bonjour,
Ayant eu le problème en local avec Laragon, voici ce que j'ai rajouté dans le fichier my.ini de mon installation :
Ceci a permis au Noizetier de s'installer correctement
J'ai le même problème sur une installation fraiche de SPIP4 sur Mariadb 10.6 .
J'ai forcé l'encodage utf8mb4_unicode_ci en suivant les recommandations de
https://dev.mysql.com/doc/refman/8.0/en/charset-unicode-utf8.html
(l'encodage par défaut de cette version de Mariadb est utf8mb3)
La création de la table spip_meta plante.
Du coup il me faut changer la clé de spip_meta
La requête fautive est
Cela passe si je modifie la longueur de la clé, bien entendu.
Il faudrait que je creuse pour que l'installation de SPIP génère une base InnoDB, c'est cela ?
Erreur dans le fichier tmp/log/mysqlmysql.log:
2022-02-22 16:55:52 88.174.137.67 (pid 1099739) :Pri:ERREUR: Erreur 1071 de mysql: Specified key was too long; max key length is 1000 bytes
A noter que si j'exécute manuellement la requête sql sans préciser le format de la table, tout passe.
L'export que je retrouve depuis Adminer est alors le suivant :
D'où provient ce MyISAM généré par SPIP à l'installation ?
@gilles.vincent oui le problème a aussi été signalé ici https://discuter.spip.net/t/alwaysdata-installation-de-spip-4/158032/6
Ce n'est pas le même problème.
Il faudrait:
Je ne l'ai pas mentionné, mais la table spip_urls n'est pas générée non plus à l'installation (toujours le même problème de taille de clé supérieure à 1000 octets)
La question qui me semble se poser est quand même :
Pourquoi est-ce que ces 2 tables ont besoin d'un index sur un varchar(255) ?
Ha, ben désolé pour le bruit, je pensais que la non création de la table spip_meta sous mariadb 10.6 mentionné dans les deux posts concernait un problème similaire...
Je viens de voir que j'ai eu exactement le même problème que
https://discuter.spip.net/t/alwaysdata-installation-de-spip-4/158032
Ce problème est documenté comme étant un bug (ou limite) de MyISAM et utf8 : https://bugs.mysql.com/bug.php?id=4541
Peut-être qu'éviter de forcer le type de base (comme le suggère déjà RealEt) et laisser le serveur gérer serait une bonne méthode.
#4277
(est-ce vraiment pertinent de forcer le type de base ?)
Pareil
Et je viens de me rendre compte avec SPIP 4.1.2 que 2 tables de SPIP sont aussi concernées :
Par contre, l'instalation a pu se faire sans problème en indiquant innoDB comme moteur de MySQL.
define('_MYSQL_ENGINE', 'InnoDB');
(et https://dba.stackexchange.com/questions/283655/mariadb-error-1071-specified-key-was-too-long-max-key-length-is-1000-bytes confirme que c'est mort avec MyISAM)
Même si je me suis fait bouler gentiment par @gilles.vincent je reviens sur ce ticket :)
@RealET confirme que ça peut être contourné par
define('_MYSQL_ENGINE', 'InnoDB');
qu'on a introduit entre temps, on peut donc fermer le ticket, non ?Bon, je tombe là dessus pour la première fois aussi…
Ça tente de créer des tables en
MyIsam
et ça ne fonctionne pas :/