Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Wie kann ich den MySQL-Fehler Nr. 1064 beheben?

TL;DR

Fehler #1064 bedeutet, dass MySQL Ihren Befehl nicht verstehen kann. Um es zu beheben:

  • Fehlermeldung lesen. Es sagt Ihnen genau wo in Ihrem Befehl MySQL war verwirrt.

  • Untersuchen Sie Ihren Befehl. Wenn Sie eine Programmiersprache verwenden, um Ihren Befehl zu erstellen, verwenden Sie echo , console.log() , oder sein Äquivalent, um den gesamten Befehl anzuzeigen damit Sie es sehen können.

  • Prüfen Sie das Handbuch. Durch einen Vergleich mit dem, was MySQL zu diesem Zeitpunkt erwartet hat , ist das Problem oft offensichtlich.

  • Auf reservierte Wörter prüfen. Wenn der Fehler bei einem Objektbezeichner aufgetreten ist, prüfen Sie, ob es sich nicht um ein reserviertes Wort handelt (und falls doch, stellen Sie sicher, dass es richtig in Anführungszeichen gesetzt wird).

  1. Aaaah!! Was bedeutet #1064 bedeutet ?

    Fehlermeldungen können aussehen wie Gobbledygook, aber sie sind (oft) unglaublich informativ und liefern genügend Details, um genau zu bestimmen, was schief gelaufen ist. Indem Sie genau verstehen, was MySQL Ihnen sagt, können Sie sich darauf vorbereiten, jedes Problem dieser Art in Zukunft zu beheben.

    Wie in vielen Programmen werden MySQL-Fehler nach dem Typ codiert des aufgetretenen Problems. Fehler #1064 ist ein Syntaxfehler.

    • Was ist diese "Syntax", von der Sie sprechen? Ist es Hexerei?

      Während "Syntax" ein Wort ist, das vielen Programmierern nur im Zusammenhang mit Computern begegnet, ist es tatsächlich aus der breiteren Linguistik entlehnt. Es bezieht sich auf den Satzbau, also die Grammatikregeln; oder mit anderen Worten, die Regeln, die definieren, was einen gültigen Satz ausmacht innerhalb der Sprache.

      Beispielsweise enthält der folgende englische Satz einen Syntaxfehler (weil der unbestimmte Artikel "a" immer vor einem Substantiv stehen muss):

      Dieser Satz enthält Syntaxfehler a.

    • Was hat das mit MySQL zu tun?

      Immer wenn man einen Befehl an einen Computer ausgibt, ist eines der allerersten Dinge, die er tun muss, diesen Befehl zu "parsen", um einen Sinn daraus zu machen. Ein "Syntaxfehler" bedeutet, dass der Parser nicht verstehen kann, was gefragt wird, weil es keinen gültigen Befehl innerhalb der Sprache darstellt:Mit anderen Worten, der Befehl verstößt gegen die Grammatik der Programmiersprache .

      Es ist wichtig zu beachten, dass der Computer den Befehl verstehen muss, bevor er etwas damit anfangen kann. Da es einen Syntaxfehler gibt, hat MySQL keine Ahnung, was man will, und gibt deshalb auf, bevor es überhaupt in die Datenbank geschaut hat und daher sind Schema- oder Tabelleninhalte nicht relevant.

  2. Wie behebe ich es?

    Offensichtlich muss man feststellen, warum der Befehl gegen die Grammatik von MySQL verstößt. Das mag ziemlich undurchdringlich klingen, aber MySQL gibt sich wirklich große Mühe, uns hier zu helfen. Alles, was wir tun müssen, ist …

    • Lesen Sie die Nachricht!

      MySQL sagt uns das nicht nur genau wo der Parser auf den Syntaxfehler gestoßen ist, macht aber auch einen Vorschlag zur Behebung. Betrachten Sie beispielsweise den folgenden SQL-Befehl:

      UPDATE my_table WHERE id=101 SET name='foo'
      

      Dieser Befehl liefert die folgende Fehlermeldung:

      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 zu verwenden

      MySQL sagt uns, dass bis zum Wort WHERE alles in Ordnung schien , aber dann ist ein Problem aufgetreten. Mit anderen Worten, es wurde nicht erwartet, auf WHERE zu stoßen zu diesem Zeitpunkt.

      Nachrichten, die ...near '' at line... sagen bedeutet einfach, dass das Ende des Befehls unerwartet aufgetreten ist:Das heißt, etwas anderes sollte erscheinen, bevor der Befehl endet.

    • Untersuchen Sie den tatsächlichen Text Ihres Befehls!

      Programmierer erstellen häufig SQL-Befehle mithilfe einer Programmiersprache. Zum Beispiel könnte ein PHP-Programm eine (falsche) Zeile wie diese haben:

      $result = $mysqli->query("UPDATE " . $tablename ."SET name='foo' WHERE id=101");
      

      Wenn Sie dies in zwei Zeilen schreiben

      $query = "UPDATE " . $tablename ."SET name='foo' WHERE id=101"
      $result = $mysqli->query($query);
      

      dann können Sie echo $query; hinzufügen oder var_dump($query) um zu sehen, dass die Abfrage tatsächlich

      lautet
      UPDATE userSET name='foo' WHERE id=101
      

      Oft sehen Sie Ihren Fehler sofort und können ihn beheben.

    • Befehle befolgen!

      MySQL empfiehlt außerdem, dass wir "das Handbuch, das unserer MySQL-Version entspricht, auf die richtige zu verwendende Syntax überprüfen ". Machen wir das.

      Ich verwende MySQL v5.6, also wende ich mich an den manuellen Eintrag dieser Version für ein UPDATE Befehl . Das Allererste auf der Seite ist die Grammatik des Befehls (dies gilt für jeden Befehl):

      UPDATE [LOW_PRIORITY] [IGNORE] table_reference
          SET col_name1={expr1|DEFAULT} [, col_name2={expr2|DEFAULT}] ...
          [WHERE where_condition]
          [ORDER BY ...]
          [LIMIT row_count]
      

      Das Handbuch erklärt, wie diese Syntax unter Typografie- und Syntaxkonventionen zu interpretieren ist , aber für unsere Zwecke reicht es aus, Folgendes zu erkennen:Klauseln in eckigen Klammern [ und ] sind optional; vertikale Balken | Alternativen angeben; und Ellipsen ... bedeuten entweder eine Auslassung der Kürze halber oder dass der vorhergehende Satz wiederholt werden darf.

      Wir wissen bereits, dass der Parser vor dem WHERE glaubte, alles in unserem Befehl sei in Ordnung Schlüsselwort, also bis einschließlich Tabellenverweis. Wenn wir uns die Grammatik ansehen, sehen wir diese table_reference muss der SET folgen Schlüsselwort:während in unserem Befehl eigentlich das WHERE folgte Stichwort. Dies erklärt, warum der Parser meldet, dass an dieser Stelle ein Problem aufgetreten ist.

    Eine Reservierungsnotiz

    Dies war natürlich ein einfaches Beispiel. Wenn Sie jedoch die beiden oben beschriebenen Schritte befolgen (d. h. genau beachten, wo im Befehl Der Parser hat festgestellt, dass die Grammatik verletzt wurde, und mit der Beschreibung des Handbuchs verglichen, was zu diesem Zeitpunkt erwartet wurde ), kann praktisch jeder Syntaxfehler leicht identifiziert werden.

    Ich sage „praktisch alle“, weil es eine kleine Klasse von Problemen gibt, die nicht ganz so leicht zu erkennen sind – und hier glaubt der Parser, dass das gefundene Sprachelement eine Sache bedeutet, während Sie beabsichtigen, dass es eine andere Bedeutung hat. Nehmen Sie das folgende Beispiel:

    UPDATE my_table SET where='foo'
    

    Auch hier erwartet der Parser nicht, auf WHERE zu stoßen An dieser Stelle und so wird ein ähnlicher Syntaxfehler ausgelöst – aber Sie hatten dieses where nicht beabsichtigt ein SQL-Schlüsselwort sein:Sie wollten damit eine zu aktualisierende Spalte identifizieren! Wie jedoch unter Schemaobjektnamen dokumentiert :

    Wenn ein Bezeichner Sonderzeichen enthält oder ein reserviertes Wort ist, müssen Sie dies müssen zitieren Sie es, wenn Sie sich darauf beziehen. (Ausnahme:Ein reserviertes Wort, das in einem qualifizierten Namen auf einen Punkt folgt, muss ein Bezeichner sein und muss daher nicht in Anführungszeichen gesetzt werden.) Reservierte Wörter sind unter Abschnitt 9.3, „Schlüsselwörter und reservierte Wörter“ .

    [ deletia ]

    Das Anführungszeichen des Bezeichners ist der Backtick („` “):

    mysql> SELECT * FROM `select` WHERE `select`.id > 100;

    Wenn der ANSI_QUOTES SQL-Modus aktiviert ist, dürfen Bezeichner auch in doppelte Anführungszeichen gesetzt werden:

    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)