TL;DR
L'erreur #1064 signifie que MySQL ne peut pas comprendre votre commande. Pour y remédier :
Lisez le message d'erreur. Il vous indique exactement où dans votre commande MySQL s'est embrouillé.
Examinez votre commande. Si vous utilisez un langage de programmation pour créer votre commande, utilisez
echo
,console.log()
, ou son équivalent pour afficher la commande entière pour que vous puissiez le voir.Consultez le manuel. En comparant avec ce que MySQL attendait à ce moment-là , le problème est souvent évident.
Vérifier les mots réservés. Si l'erreur s'est produite sur un identifiant d'objet, vérifiez qu'il ne s'agit pas d'un mot réservé (et, si c'est le cas, assurez-vous qu'il est bien entre guillemets).
-
Aaaaah !! Que signifie #1064 signifie ?
Les messages d'erreur peuvent apparaître comme le charabia, mais ils sont (souvent) incroyablement informatifs et fournissent suffisamment de détails pour identifier ce qui n'a pas fonctionné. En comprenant exactement ce que MySQL vous dit, vous pouvez vous armer pour résoudre tout problème de ce type à l'avenir.
Comme dans de nombreux programmes, les erreurs MySQL sont codées selon le type du problème survenu. Erreur #1064 est une erreur de syntaxe.
-
Quelle est cette "syntaxe" dont vous parlez ? Est-ce de la sorcellerie ?
Alors que "syntaxe" est un mot que de nombreux programmeurs ne rencontrent que dans le contexte des ordinateurs, il est en fait emprunté à une linguistique plus large. Il fait référence à la structure de la phrase :c'est-à-dire les règles de grammaire; ou, en d'autres termes, les règles qui définissent ce qui constitue une phrase valide dans la langue.
Par exemple, la phrase anglaise suivante contient une erreur de syntaxe (car l'article indéfini "a" doit toujours précéder un nom) :
Cette phrase contient une erreur de syntaxe a.
-
Qu'est-ce que cela a à voir avec MySQL ?
Chaque fois que l'on envoie une commande à un ordinateur, l'une des toutes premières choses qu'il doit faire est "d'analyser" cette commande afin de lui donner un sens. Une "erreur de syntaxe" signifie que l'analyseur est incapable de comprendre ce qui est demandé car cela ne constitue pas une commande valide dans le langage :en d'autres termes, la commande viole la grammaire du langage de programmation .
Il est important de noter que l'ordinateur doit comprendre la commande avant de pouvoir en faire quoi que ce soit. Parce qu'il y a une erreur de syntaxe, MySQL n'a aucune idée de ce que l'on cherche et abandonne donc avant même de regarder la base de données et donc le schéma ou le contenu de la table n'est pas pertinent.
-
-
Comment résoudre le problème ?
Évidemment, il faut déterminer comment il se fait que la commande viole la grammaire de MySQL. Cela peut sembler assez impénétrable, mais MySQL s'efforce vraiment de nous aider ici. Tout ce que nous devons faire, c'est…
-
Lisez le message !
MySQL nous dit non seulement exactement où l'analyseur a rencontré l'erreur de syntaxe, mais fait également une suggestion pour la corriger. Par exemple, considérez la commande SQL suivante :
UPDATE my_table WHERE id=101 SET name='foo'
Cette commande génère le message d'erreur suivant :
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'WHERE id=101 SET name='foo'' at line 1
MySQL nous dit que tout semblait bien jusqu'au mot
WHERE
, mais un problème a ensuite été rencontré. En d'autres termes, il ne s'attendait pas à rencontrerWHERE
à ce moment-là.Messages indiquant
...near '' at line...
signifie simplement que la fin de la commande a été rencontrée de manière inattendue :c'est-à-dire que quelque chose d'autre doit apparaître avant la fin de la commande. -
Examinez le texte réel de votre commande !
Les programmeurs créent souvent des commandes SQL à l'aide d'un langage de programmation. Par exemple, un programme php peut avoir une (mauvaise) ligne comme celle-ci :
$result = $mysqli->query("UPDATE " . $tablename ."SET name='foo' WHERE id=101");
Si vous écrivez ceci en deux lignes
$query = "UPDATE " . $tablename ."SET name='foo' WHERE id=101" $result = $mysqli->query($query);
alors vous pouvez ajouter
echo $query;
ouvar_dump($query)
pour voir que la requête indique réellementUPDATE userSET name='foo' WHERE id=101
Souvent, vous verrez votre erreur immédiatement et pourrez la corriger.
-
Obéissez aux ordres !
MySQL nous recommande également de "vérifier le manuel qui correspond à notre version de MySQL pour la bonne syntaxe à utiliser ". Faisons cela.
J'utilise MySQL v5.6, donc je vais me tourner vers la saisie manuelle de cette version pour une
UPDATE
commande . La toute première chose sur la page est la grammaire de la commande (ceci est vrai pour chaque commande) :UPDATE [LOW_PRIORITY] [IGNORE] table_reference SET col_name1={expr1|DEFAULT} [, col_name2={expr2|DEFAULT}] ... [WHERE where_condition] [ORDER BY ...] [LIMIT row_count]
Le manuel explique comment interpréter cette syntaxe sous Conventions typographiques et syntaxiques , mais pour nos besoins, il suffit de reconnaître que :les clauses contenues entre crochets
[
et]
sont facultatifs ; barres verticales|
indiquer des alternatives ; et points de suspension...
signifier soit une omission par souci de brièveté, soit que la clause précédente peut être répétée.Nous savons déjà que l'analyseur croyait que tout dans notre commande était correct avant le
WHERE
mot-clé, c'est-à-dire jusqu'à et y compris la référence de la table. En regardant la grammaire, nous voyons quetable_reference
doit être suivi duSET
mot-clé :alors que dans notre commande, il était en fait suivi duWHERE
mot-clé. Cela explique pourquoi l'analyseur signale qu'un problème a été rencontré à ce stade.
Une note de réservation
Bien sûr, c'était un exemple simple. Cependant, en suivant les deux étapes décrites ci-dessus (c'est-à-dire en observant exactement où dans la commande l'analyseur a trouvé que la grammaire était violée et a comparé avec la description du manuel de ce qui était attendu à ce moment-là ), pratiquement toutes les erreurs de syntaxe peuvent être facilement identifiées.
Je dis "pratiquement tous", car il existe une petite classe de problèmes qui ne sont pas si faciles à repérer - et c'est là que l'analyseur croit que l'élément de langage rencontré signifie une chose alors que vous avez l'intention qu'il en signifie une autre. Prenons l'exemple suivant :
UPDATE my_table SET where='foo'
Encore une fois, l'analyseur ne s'attend pas à rencontrer
WHERE
à ce stade et soulèvera donc une erreur de syntaxe similaire, mais vous n'aviez pas prévu pour cewhere
être un mot-clé SQL :vous l'aviez prévu pour identifier une colonne à mettre à jour ! Cependant, comme documenté sous Schema Object Names :Si un identifiant contient des caractères spéciaux ou est un mot réservé, vous devez citez-le chaque fois que vous y faites référence. (Exception :un mot réservé qui suit un point dans un nom qualifié doit être un identifiant, il n'est donc pas nécessaire de le mettre entre guillemets.) Les mots réservés sont répertoriés sur Section 9.3, "Mots clés et mots réservés" .
[ deletia ]
Le guillemet de l'identifiant est le backtick ("
`
”) :mysql> SELECT * FROM `select` WHERE `select`.id > 100;
Si le
ANSI_QUOTES
Le mode SQL est activé, il est également permis de mettre les identifiants entre guillemets doubles :mysql> CREATE TABLE "test" (col INT); ERROR 1064: You have an error in your SQL syntax... mysql> SET sql_mode='ANSI_QUOTES'; mysql> CREATE TABLE "test" (col INT); Query OK, 0 rows affected (0.00 sec)
-