wake-up-neo.net

Wie kann ich den MySQL-Fehler # 1064 beheben?

Bei der Ausgabe eines Befehls an MySQL erhalte ich den Fehler # 1064 "Syntaxfehler".

  1. Was heißt das?

  2. Wie kann ich es reparieren?

59
eggyal

TL; DR

Fehler # 1064 bedeutet, dass MySQL Ihren Befehl nicht verstehen kann. Etwas reparieren:

  • Lesen Sie die Fehlermeldung. Sie sagt Ihnengenau, wo in Ihrem BefehlMySQL verwirrt wurde.

  • Überprüfen Sie Ihren Befehl. Wenn Sie eine Programmiersprache zum Erstellen Ihres Befehls verwenden, verwenden Sie echo, console.log() oder Es entspricht dem Befehlcomplete, damit Sie es sehen können.

  • Überprüfen Sie das Handbuch. Durch Vergleichen mit dem, was MySQLan diesem Punkt erwartet, ist das Problem oft offensichtlich.

  • Auf reservierte Wörter prüfen. Wenn der Fehler bei einer Objektkennung aufgetreten ist, prüfen Sie, ob es sich um ein reserviertes Wort handelt (und stellen Sie sicher, dass dies der Fall ist es ist richtig zitiert).

  1. Aaaagh !! Was bedeutet # 1064?

    Fehlermeldungen mögenaussehenwie ein Gobbledygook, aber sie sind (oft) unglaublich informativ und liefern genügend Details, um genau zu bestimmen, was schief gelaufen ist. Wenn Sie genau verstehen, was MySQL Ihnen sagt, können Sie sich rüsten, um Probleme dieser Art in Zukunft zu beheben.

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

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

      Während "Syntax" ein Wort ist, dem viele Programmierer nur im Kontext von Computern begegnen, ist es in der Tat von einer breiteren Sprachwissenschaft entlehnt. Es bezieht sich auf die Satzstruktur: d. H.die Grammatikregeln; oder mit anderen Worten, die Regeln, die definieren, was einengültigen Satzinnerhalb der Sprache ausmacht.

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

      Dieser Satz enthält einen Syntaxfehler a.

    • Was hat das mit MySQL zu tun?

      Jedes Mal, wenn ein Befehl an einen Computer gesendet wird, muss dieser Befehl als erstes "analysiert" werden, um einen Sinn daraus zu ziehen. Ein "Syntaxfehler" bedeutet, dass der Parser nicht verstehen kann, was gefragt wird, da es sich nicht um einen gültigen Befehl in der Sprache handelt. Mit anderen Worten, der Befehl verstößt gegen die Grammatik der Programmierung Sprache .

      Es ist wichtig zu beachten, dass der Computer den Befehl verstehen muss, bevor er etwas damit anfangen kann. Da es sich um einen Syntaxfehler handelt, hat MySQL keine Ahnung, worauf es ankommt, und gibt daherauf, bevor es sogar die Datenbankansieht, und daher sind Schema- oder Tabelleninhalte nicht relevant .

  2. Wie behebe ich das?

    Offensichtlich muss man feststellen, wie es ist, dass der Befehl gegen die Grammatik von MySQL verstößt. Das hört sich vielleicht ziemlich undurchdringlich an, aber MySQL ist sehr bemüht, uns hier zu helfen. Alles was wir tun müssen ist ...

    • Lies die Nachricht!

      MySQL sagt uns nicht nurgenau, wo der Parser auf den Syntaxfehler gestoßen ist, sondern schlägt auch vor, ihn zu beheben. Betrachten Sie beispielsweise den folgenden SQL-Befehl:

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

      Dieser Befehl gibt die folgende Fehlermeldung aus:

      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 sagt uns, dass bis zum Word WHERE alles in Ordnung schien, aber dann wurde ein Problem festgestellt. Mit anderen Worten, es wurde nicht erwartet, an diesem Punkt auf WHERE zu stoßen.

      Meldungen mit dem Zusatz ...near '' at line... Bedeuten lediglich, dass das Ende des Befehls unerwartet aufgetreten ist. Das heißt, vor dem Ende des Befehls sollte etwas anderes angezeigt werden.

    • Untersuchen Sie den tatsächlichen Text Ihres Befehls!

      Programmierer erstellen SQL-Befehle häufig in 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; oder var_dump($query) hinzufügen, 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.

    • Anweisungen folgen!

      MySQL empfiehlt außerdem, dass wir "das Handbuch überprüfen, das unserer MySQL-Version entspricht, um die richtige Syntax für die Verwendung von" zu finden. Lass uns das tun.

      Ich verwende MySQL v5.6, daher gehe ich zu dem manuellen Eintrag dieser Version für einen 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 Typografische und Syntaxkonventionen interpretiert wird. Für unsere Zwecke ist es jedoch ausreichend zu erkennen, dass: Klauseln in eckigen Klammern [ Und ] Optional sind; vertikale Balken | zeigen Alternativen an; und Ellipsen ... bezeichnen entweder eine Auslassung der Kürze oder die Wiederholung der vorhergehenden Klausel.

      Wir wissen bereits, dass der Parser glaubte, dass alles in unserem Befehl in Ordnung war, bevor das Schlüsselwort WHERE oder mit anderen Worten, bis einschließlich der Tabellenreferenz. Wenn wir uns die Grammatik ansehen, sehen wir, dass table_reference gefolgt werden muss das SET Schlüsselwort: während in unserem Befehl tatsächlich das WHERE Schlüsselwort gefolgt wurde. Dies erklärt, warum der Parser meldet, dass zu diesem Zeitpunkt ein Problem aufgetreten ist.

    Eine Notiz der Reservierung

    Dies war natürlich ein einfaches Beispiel. Befolgen Sie jedoch die beiden oben beschriebenen Schritte (dh beobachten Siegenau, wo im Befehlder Parser die zu verletzende Grammatik gefunden hat, und vergleichen Sie sie mit der Beschreibung vonwas 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 so leicht zu erkennen sind - und da glaubt der Parser, dass das angetroffene Sprachelement eine Sache bedeutet, während Sie beabsichtigen, dass es eine andere bedeutet. Nehmen Sie das folgende Beispiel:

    UPDATE my_table SET where='foo'
    

    Wiederum erwartet der Parser zu diesem Zeitpunkt keine Begegnung mit WHERE und löst daher einen ähnlichen Syntaxfehler aus - aber Sie hatten nicht beabsichtigt, dass where ein SQL-Schlüsselwort ist: Sie hatten beabsichtigt damit es eine Spalte zum Aktualisieren identifiziert! Wie jedoch unter Schemaobjektnamen dokumentiert:

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

    [deletia]

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

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

    Wenn der ANSI_QUOTES SQL-Modus aktiviert ist, ist es auch zulässig, Bezeichner in doppelten Anführungszeichen anzugeben:

    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)
109
eggyal

Für meinen Fall habe ich versucht, Prozedurcode in MySQL auszuführen, und aufgrund eines Problems mit dem Server, bei dem Server nicht herausfinden kann, wo die Anweisung zu beenden ist, erhielt ich den Fehlercode 1064. Daher habe ich die Prozedur mit benutzerdefiniertem DELIMITER und es hat gut funktioniert.

Zum Beispiel war es vorher:

DROP PROCEDURE IF EXISTS getStats;
CREATE PROCEDURE `getStats` (param_id INT, param_offset INT, param_startDate datetime, param_endDate datetime)
BEGIN
    /*Procedure Code Here*/
END;

Nach dem Setzen von DELIMITER war es so:

DROP PROCEDURE IF EXISTS getStats;
DELIMITER $$
CREATE PROCEDURE `getStats` (param_id INT, param_offset INT, param_startDate datetime, param_endDate datetime)
BEGIN
    /*Procedure Code Here*/
END;
$$
DELIMITER ;
1
Umair Malhi

Wenn Sie beim Ausführen einer SQL-Expression mit einem Semikolon wie CREATE PROCEDURE den Fehler mit SQuirreL Client erhalten, benötigen Sie das MySQL-Plugin. Sie können es bei der Installation auswählen. Es ist standardmäßig nicht ausgewählt.

0
Horcrux7

Diese Fehlermeldung wird auch angezeigt, wenn Sie versuchen, JSON oder andere Daten mit Sonderzeichen ohne die erforderlichen Anführungszeichen einzufügen, z.

UPDATE myTable SET myJSONfield = {};

Ändern Sie es in 

UPDATE myTable SET myJSONfield = '{}';
0
Andrew

Möglicherweise enthält Ihre Zeichenfolge oder die eingefügten Daten ein einfaches Anführungszeichen ', das Sie ausprobieren können 

mysql_real_escape_string() for mysql or mysqli_real_escape_string() for mysqli

funktion, um die Zeichenfolge beim Einfügen von Daten (Einfügeabfrage) in die Datenbank zu sichern.

0
Hussnain sheikh

Es gibt verschiedene Gründe dafür. Wenn wir eine Variable deklarieren, sollte sie vor allen anderen Arten von Anweisungen stehen. ansonsten müssen wir einen BEGIN-Block davor setzen.

DECLARE _RoomID INTEGER ;

    SET _dtTodayTmp=NOW();
    SET _dtToday=DATE_FORMAT(_dtTodayTmp,"%m/%d/%y");
    SET _tmNow=DATE_FORMAT(_dtTodayTmp,"%h:%i:%s");

    DECLARE tree_cursor1 CURSOR 
    FOR SELECT roomid FROM reservationDet rd WHERE rd.status=3 AND rd.compcode=pCompCode; 

gibt Fehler, also müssen wir es machen 

DECLARE _RoomID INTEGER ;
    SET _dtTodayTmp=NOW();
    SET _dtToday=DATE_FORMAT(_dtTodayTmp,"%m/%d/%y");
    SET _tmNow=DATE_FORMAT(_dtTodayTmp,"%h:%i:%s"); 

    **BEGIN**
        DECLARE tree_cursor1 CURSOR
        FOR SELECT roomid FROM reservationDet WHERE STATUS = 3 AND compcode = pCompCode ; 
0
user5493732