Syntaxfehler aufgrund der Verwendung eines reservierten Wortes als Tabellen- oder Spaltenname in MySQL

May 03 2014

Ich versuche, eine einfache MySQL-Abfrage wie folgt auszuführen:

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

Aber ich bekomme folgenden Fehler:

FEHLER 1064 (42000): In Ihrer SQL-Syntax ist ein Fehler aufgetreten. Überprüfen Sie das Handbuch, das Ihrer MySQL-Serverversion entspricht, auf die richtige Syntax, die Sie in 'key) VALUES ('Tim', 'Florida', 42)'Zeile 1 verwenden können

Wie kann ich das Problem beheben?

Antworten

294 AmalMurali May 03 2014 at 22:29

#Das Problem

In MySQL, bestimmte Wörter wie SELECT, INSERT, DELETEusw. sind reservierte Wörter. Da sie eine besondere Bedeutung haben, behandelt MySQL sie als Syntaxfehler, wenn Sie sie als Tabellennamen, Spaltennamen oder eine andere Art von Bezeichner verwenden - es sei denn, Sie umgeben den Bezeichner mit Backticks.

Wie in den offiziellen Dokumenten in Abschnitt 10.2 Schemaobjektnamen (Hervorhebung hinzugefügt) angegeben:

Bestimmte Objekte in MySQL, einschließlich Datenbank, Tabelle, Index, Spalte, Alias, Ansicht, gespeicherte Prozedur, Partition, Tabellenbereich und andere Objektnamen, werden als Bezeichner bezeichnet .

...

Wenn ein Bezeichner Sonderzeichen enthält oder ein reserviertes Wort ist , müssen Sie ihn bei jedem Verweis zitieren.

...

Das Bezeichner-Anführungszeichen ist das Backtick (" `"):

Eine vollständige Liste der Schlüsselwörter und reservierten Wörter finden Sie in Abschnitt 10.3 Schlüsselwörter und reservierte Wörter . Auf dieser Seite sind Wörter gefolgt von "(R)" reservierte Wörter. Einige reservierte Wörter sind unten aufgeführt, darunter viele, die dieses Problem verursachen können.

  • HINZUFÜGEN
  • UND
  • VOR
  • DURCH
  • ANRUF
  • FALL
  • BEDINGUNG
  • LÖSCHEN
  • DESC
  • BESCHREIBEN
  • VON
  • GRUPPE
  • IM
  • INDEX
  • EINFÜGEN
  • INTERVALL
  • IS
  • SCHLÜSSEL
  • MÖGEN
  • GRENZE
  • LANGE
  • SPIEL
  • NICHT
  • MÖGLICHKEIT
  • ODER
  • BESTELLEN
  • Teilung
  • VERWEISE
  • WÄHLEN
  • TABELLE
  • ZU
  • AKTUALISIEREN
  • WO

#Die Lösung

Sie haben zwei Möglichkeiten.

1. Verwenden Sie keine reservierten Wörter als Bezeichner

Die einfachste Lösung besteht einfach darin, die Verwendung reservierter Wörter als Bezeichner zu vermeiden. Sie können wahrscheinlich einen anderen vernünftigen Namen für Ihre Spalte finden, der kein reserviertes Wort ist.

Dies hat einige Vorteile:

  • Es wird die Möglichkeit ausgeschlossen, dass Sie oder ein anderer Entwickler, der Ihre Datenbank verwendet, versehentlich einen Syntaxfehler schreiben, weil Sie vergessen oder nicht wissen, dass ein bestimmter Bezeichner ein reserviertes Wort ist. Es gibt viele reservierte Wörter in MySQL und die meisten Entwickler kennen wahrscheinlich nicht alle. Wenn Sie diese Wörter überhaupt nicht verwenden, vermeiden Sie es, sich selbst oder zukünftigen Entwicklern Fallen zu hinterlassen.

  • Die Mittel zum Zitieren von Bezeichnern unterscheiden sich zwischen SQL-Dialekten. Während MySQL standardmäßig Backticks zum Zitieren von Bezeichnern verwendet, verwendet ANSI-kompatibles SQL (und tatsächlich MySQL im ANSI-SQL-Modus, wie hier angegeben ) doppelte Anführungszeichen zum Zitieren von Bezeichnern. Abfragen, die Bezeichner mit Backticks zitieren, lassen sich daher weniger leicht auf andere SQL-Dialekte übertragen.

Nur um das Risiko zukünftiger Fehler zu verringern, ist dies normalerweise eine klügere Vorgehensweise als das Backtick-Zitieren der Kennung.

2. Verwenden Sie Backticks

Wenn das Umbenennen der Tabelle oder Spalte nicht möglich ist, schließen Sie den fehlerhaften Bezeichner in backticks ( `) ein, wie im vorherigen Zitat aus 10.2 Schemaobjektnamen beschrieben .

Ein Beispiel zur Demonstration der Verwendung (entnommen aus 10.3 Schlüsselwörtern und reservierten Wörtern ):

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)'

mysql> CREATE TABLE interval (begin INT, end INT); Query OK, 0 rows affected (0.01 sec)

In ähnlicher Weise kann die Abfrage aus der Frage behoben werden, indem das Schlüsselwort keyin Backticks eingeschlossen wird, wie unten gezeigt:

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