Désactivation de NO_ENGINE_SUBSTITUTION avec INNODB non actif, une mauvaise combinaison
- Jusqu'à MySql 5.5, le mode sqlmode par défaut était une chaîne vide, ce qui signifie que le mode sqlmode NO_ENGINE_SUBSTITUTION n'était pas défini par défaut
Conformément à la documentation de MySql (voir https://dev.mysql.com/doc/refman/5.6/en/sql-mode.html#sqlmode_no_engine_substitution), voici la signification du mode sqlmode NO_ENGINE_SUBSTITUTION :
Contrôle de la substitution automatique du moteur de stockage par défaut lorsqu'une déclaration comme CREATE TABLE ou ALTER TABLE spécifie un moteur de stockage qui est désactivé ou non compilé.
Étant donné que les moteurs de stockage peuvent être ajoutés à l'exécution, les moteurs indisponibles sont traités de la même manière :
Avec NO_ENGINE_SUBSTITUTION désactivé, pour CREATE TABLE le moteur par défaut est utilisé et un avertissement survient si le moteur désiré n'est pas disponible. Pour ALTER TABLE, un avertissement survient et la table ne est pas modifiée.
Avec NO_ENGINE_SUBSTITUTION activé, une erreur survient et la table n' est pas créée ou modifiée si le moteur désiré est indisponible.
- Donc : si NO_ENGINE_SUBSTITUTION est désactivé ET INNODB est désactivé, MySql basculera également vers MYISAM même si vous spécifiez INNODB dans votre instruction CREATE TABLE.
- Si la table que vous créez est adaptée à MYISAM, vous recevrez simplement un avertissement et la table sera créée. Ce n'est pas votre cas, votre instruction de création inclut un index qui dépasse la limite de 1000 octets de MYISAM, alors la création échoue avec l'erreur 1071 signalant l'erreur de MYISAM. Cela est dû au fait que le moteur en cours est MYISAM, et non INNODB.
PREUVE
Version de MySql 5.1.56 communauté
Cas 1 :
Options dans my.cnf
sql-mode=""
default-storage-engine=MYISAM
skip-innodb en commentaire (sans #)
Résultat de l'exécution de votre instruction de création :
Code d'erreur : 1071. Clé spécifiée trop longue ; longueur maximale de la clé est de 1000 octets
Explication : INNODB n'est pas actif, le moteur bascule automatiquement en MYISAM
ce qui retourne cette erreur car la clé est plus longue que la limite de 1000 octets de MYISAM.
La longueur de la clé est :
2 champs x 255 caractères x 3 octets (encodage utf8) + 2 x 1 octet (longueur) = 1532 octets
...