Project

General

Profile

Anomalie #4342

Erreur 1071 de mysql: Specified key was too long; max key length is 1000 bytes

Added by RealET 🔸 almost 2 years ago. Updated 14 days ago.

Status:
En cours
Priority:
Normal
Assignee:
-
Category:
documentation
Target version:
Start date:
05/26/2019
Due date:
% Done:

0%

Resolution:
Navigateur:

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 :

https://florent.poinsaut.fr/2018/08/17/mysql-mariadb-index-column-size-too-large-the-maximum-column-size-is-767-bytes/ :

- 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.

#7 Updated by RealET 🔸 4 months ago

Pour info, même problème avec la table spip_mailsubscribers et UNIQUE email (email(255))

#8 Updated by cedric - 14 days ago

  • Category set to documentation
  • Target version set to 3.3
  • Resolution deleted (invalid)

Du coup c'est de la documentation, non ?

Also available in: Atom PDF