48 votes

Erreur de syntaxe due à l'utilisation d'un mot réservé comme nom de table ou de colonne dans MySQL

J'essaie d'exécuter une simple requête MySQL comme ci-dessous :

INSERT INTO user_details (username, location, key)
VALUES ('Tim', 'Florida', 42)

Mais j'obtiens l'erreur suivante :

ERREUR 1064 (42000) : Vous avez une erreur dans votre syntaxe SQL ; consultez le manuel correspondant à la version de votre serveur MySQL pour connaître la bonne syntaxe à utiliser près de 'key) VALUES ('Tim', 'Florida', 42)' à la ligne 1

Comment puis-je résoudre ce problème ?

13 votes

Si vous avez été redirigé ici mais que vous n'obtenez aucun message d'erreur, c'est probablement parce que vous n'avez pas effectué de vérification des erreurs. Cherchez des conseils sur la façon de le faire pour votre langue, votre bibliothèque et/ou votre outil - ne postez pas ici chaque fois que quelque chose ne fonctionne pas. Merci !

1 votes

Pourquoi seulement MySQL ? Ce problème ne se pose-t-il pas dans toutes les technologies/langues ? Une telle référence/question/réponse canonique ne devrait-elle pas être applicable indépendamment d'une balise ? Aurons-nous une autre référence similaire AQ séparément pour SQLServer parce que les backticks ne s'appliquent pas à cet endroit ; ou bien C o C# o VB et nous pourrions nous retrouver avec une centaine de ces références AQ ?

4 votes

@abhitalks : Parce que chaque implémentation a une saveur différente de SQL et ce qui s'applique à MySQL ne s'applique pas nécessairement à d'autres saveurs. Une question de référence pourrait apparaître si la communauté concernée en ressent le besoin. sinon je ne m'en préoccuperais pas. Et avoir une douzaine de questions de référence vaut mieux que d'avoir des milliers de questions dupliquées IMO.

323voto

Amal Murali Points 37729

Le problème

Dans MySQL, certains mots comme SELECT , INSERT , DELETE etc. sont des mots réservés. Puisqu'ils ont une signification spéciale, MySQL traite comme une erreur de syntaxe chaque fois que vous les utilisez comme nom de table, nom de colonne ou autre type d'identifiant - à moins que vous n'entouriez l'identifiant avec des backticks.

Comme indiqué dans les documents officiels, dans la section 10.2 Noms des objets du schéma (accentuation ajoutée) :

Certains objets de MySQL, notamment la base de données, la table, l'index, la colonne, l'alias, la vue, la procédure stockée, la partition, le tablespace et d'autres noms d'objets sont connus sous le nom de identifiants .

...

Si un identifiant contient des caractères spéciaux ou est un mot réservé vous doit le citer chaque fois que vous y faites référence.

...

Le caractère de citation de l'identifiant est le backtick (" ` ") :

Une liste complète des mots clés et des mots réservés se trouve dans la section 10.3 Mots-clés et mots réservés . Dans cette page, les mots suivis de "(R)" sont des mots réservés. Certains mots réservés sont énumérés ci-dessous, y compris ceux qui ont tendance à causer ce problème.

  • ADD
  • ET
  • AVANT
  • PAR
  • APPELEZ
  • CASE
  • CONDITION
  • DELETE
  • DESC
  • DESCRIRE
  • DE
  • GROUPE
  • DANS
  • INDEX
  • INSERT
  • INTERVALLE
  • IS
  • KEY
  • LIKE
  • LIMITE
  • LONGUEUR
  • MATCH
  • PAS
  • OPTION
  • OU
  • ORDRE
  • PARTITION
  • RANK
  • RÉFÉRENCES
  • SÉLECTIONNER
  • TABLEAU
  • À
  • UPDATE

La solution

Vous avez deux options.

1. N'utilisez pas de mots réservés comme identifiants

La solution la plus simple consiste simplement à éviter d'utiliser des mots réservés comme identifiants. Vous pouvez probablement trouver un autre nom raisonnable pour votre colonne qui ne soit pas un mot réservé.

Cela présente plusieurs avantages :

  • Il élimine la possibilité que vous ou un autre développeur utilisant votre base de données écrive accidentellement une erreur de syntaxe en raison de l'oubli - ou de l'ignorance - qu'un identifiant particulier est un mot réservé. Il existe de nombreux mots réservés dans MySQL et il est peu probable que la plupart des développeurs les connaissent tous. En n'utilisant pas ces mots en premier lieu, vous évitez de laisser des pièges pour vous-même ou pour les futurs développeurs.

  • Le mode de citation des identifiants diffère selon les dialectes SQL. Alors que MySQL utilise par défaut des backticks pour citer les identifiants, le SQL conforme à ANSI (et en fait MySQL en mode SQL ANSI, comme indiqué dans le paragraphe précédent) utilise les backticks pour citer les identifiants. aquí ) utilise des guillemets doubles pour citer les identifiants. Ainsi, les requêtes qui citent les identifiants avec des guillemets sont moins facilement transférables à d'autres dialectes SQL.

Dans le seul but de réduire le risque d'erreurs futures, il est généralement plus sage de procéder ainsi que de rétrociter l'identifiant.

2. Utiliser des backticks

S'il n'est pas possible de renommer la table ou la colonne, il suffit d'entourer l'identifiant en question de guillemets ( ` ) comme décrit dans la citation précédente de 10.2 Noms des objets du schéma .

Un exemple pour démontrer l'utilisation (tiré de 10.3 Mots-clés et mots réservés ):

mysql> CREATE TABLE interval (begin INT, end INT);
ERROR 1064 (42000): You have an error in your SQL syntax.
near 'interval (begin INT, end INT)'

De même, la requête de la question peut être fixée en enveloppant le mot-clé key en points de suspension, comme indiqué ci-dessous :

INSERT INTO user_details (username, location, `key`)
VALUES ('Tim', 'Florida', 42)";               ^   ^

25 votes

-1. Je pense que suggérer d'utiliser début et fin sans backticks dans une réponse de référence à cette question est particulièrement diabolique. Une meilleure pratique est d'utiliser les backticks, point, sans avoir à savoir quel mot-clé est réservé ou non réservé.

16 votes

@MarcAlff : begin y end sont pas des mots réservés. L'exemple ci-dessus visait simplement à démontrer comment le message d'erreur peut être résolu en utilisant des backticks. Et le fait de ne pas utiliser un mot réservé est une meilleure pratique que de citer aveuglément tous les identificateurs, même s'ils ne sont pas nécessaires.

3 votes

Je suis d'accord que la solution 1 est meilleure, quand quelqu'un peut réellement choisir les noms d'identifiants. Lorsque le nom ne peut pas être changé, comme dans la solution 2, avoir à enquêter sur les identifiants qui sont des mots-clés, et si ces mots-clés sont réservés ou non (même si les versions futures ?), est une source de complication. BTW, j'ai enlevé le -1 car l'exemple provient en fait du manuel.

-1voto

Rockse Points 787

Veuillez ne pas tenir compte de l'utilisation de mots réservés comme identifiants, vous en trouverez la liste ici. http://dev.mysql.com/doc/mysqld-version-reference/en/mysqld-version-reference-reservedwords-5-5.html

Mais si vous voulez quand même utiliser un mot-clé réservé alors

  1. Vous pouvez utiliser des guillemets doubles si Mode ANSI SQL est activé

    INSERT INTO user_details (username, location, "key")
    VALUES ('Tim', 'Florida', 42);
  2. Ou utiliser le tic-tac arrière propriétaire en s'échappant autrement. (" ` ")

    INSERT INTO user_details (username, location, `key`)
    VALUES ('Tim', 'Florida', 42);

NOTE : (" ` ") est celui dans la boîte rouge (pour le clavier QWERTY)

enter image description here

-1voto

Pascal BERNARD Points 9

Autre moyen : éviter d'utiliser des mots clés (également appelés mots réservés)

ALTER TABLE user_detail CHANGE `key` userkey; 

Vous n'aurez alors plus à vous soucier des citations.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X