Mysql
 sql >> Database >  >> RDS >> Mysql

Come posso correggere l'errore MySQL n. 1064?

TL;DR

L'errore #1064 significa che MySQL non riesce a capire il tuo comando. Per risolverlo:

  • Leggi il messaggio di errore. Ti dice esattamente dove sei nel tuo comando MySQL si è confuso.

  • Esamina il tuo comando. Se usi un linguaggio di programmazione per creare il tuo comando, usa echo , console.log() o equivalente per mostrare l'intero comando così puoi vederlo.

  • Controlla il manuale. Confrontando ciò che MySQL si aspettava a quel punto , il problema è spesso evidente.

  • Cerca le parole riservate. Se l'errore si è verificato su un identificatore di oggetto, controlla che non sia una parola riservata (e, in tal caso, assicurati che sia correttamente citata).

  1. Aaaagh!! Cosa significa #1064 significa ?

    I messaggi di errore possono apparire come gobbledygook, ma sono (spesso) incredibilmente istruttivi e forniscono dettagli sufficienti per individuare cosa è andato storto. Comprendendo esattamente ciò che MySQL ti sta dicendo, puoi prepararti a risolvere qualsiasi problema di questo tipo in futuro.

    Come in molti programmi, gli errori MySQL sono codificati in base al tipo di problema verificatosi. Errore #1064 è un errore di sintassi.

    • Cos'è questa "sintassi" di cui parli? È stregoneria?

      Sebbene "sintassi" sia una parola che molti programmatori incontrano solo nel contesto dei computer, in realtà è presa in prestito da una linguistica più ampia. Si riferisce alla struttura della frase:cioè le regole grammaticali; o, in altre parole, le regole che definiscono cosa costituisce una frase valida all'interno della lingua.

      Ad esempio, la seguente frase inglese contiene un errore di sintassi (perché l'articolo indeterminativo "a" deve sempre precedere un sostantivo):

      Questa frase contiene un errore di sintassi a.

    • Che cosa ha a che fare con MySQL?

      Ogni volta che si invia un comando a un computer, una delle prime cose che deve fare è "analizzare" quel comando per dargli un senso. Un "errore di sintassi" significa che il parser non è in grado di capire cosa viene chiesto perché non costituisce un comando valido all'interno del linguaggio:in altre parole, il comando viola la grammatica del linguaggio di programmazione .

      È importante notare che il computer deve comprendere il comando prima di poter eseguire qualsiasi operazione con esso. Poiché c'è un errore di sintassi, MySQL non ha idea di cosa si stia cercando e quindi si arrende prima ancora di guardare il database e quindi lo schema o il contenuto della tabella non sono rilevanti.

  2. Come lo risolvo?

    Ovviamente, è necessario determinare in che modo il comando viola la grammatica di MySQL. Questo può sembrare piuttosto impenetrabile, ma MySQL sta cercando davvero di aiutarci qui. Tutto quello che dobbiamo fare è...

    • Leggi il messaggio!

      MySQL non solo ci dice esattamente dove il parser ha riscontrato l'errore di sintassi, ma fornisce anche un suggerimento per risolverlo. Ad esempio, considera il seguente comando SQL:

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

      Quel comando restituisce il seguente messaggio di errore:

      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 ci sta dicendo che tutto sembrava a posto fino alla parola WHERE , ma si è verificato un problema. In altre parole, non si aspettava di incontrare WHERE a quel punto.

      Messaggi che dicono ...near '' at line... significa semplicemente che la fine del comando è stata incontrata in modo imprevisto:cioè, qualcos'altro dovrebbe apparire prima della fine del comando.

    • Esamina il testo effettivo del tuo comando!

      I programmatori creano spesso comandi SQL utilizzando un linguaggio di programmazione. Ad esempio un programma php potrebbe avere una riga (sbagliata) come questa:

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

      Se lo scrivi su due righe

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

      quindi puoi aggiungere echo $query; o var_dump($query) per vedere che la query dice effettivamente

      UPDATE userSET name='foo' WHERE id=101
      

      Spesso vedrai immediatamente il tuo errore e sarai in grado di risolverlo.

    • Rispetta gli ordini!

      MySQL consiglia inoltre di "controllare il manuale che corrisponde alla nostra versione di MySQL per la sintassi corretta da utilizzare ". Facciamolo.

      Sto usando MySQL v5.6, quindi passerò a l'immissione manuale di quella versione per un UPDATE comando . La prima cosa in assoluto sulla pagina è la grammatica del comando (questo vale per ogni comando):

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

      Il manuale spiega come interpretare questa sintassi in Convenzioni tipografiche e sintattiche , ma per i nostri scopi basta riconoscere che:clausole contenute tra parentesi quadre [ e ] sono facoltativi; barre verticali | indicare alternative; e puntini di sospensione ... denotare o un'omissione per brevità, o che la frase precedente può essere ripetuta.

      Sappiamo già che il parser credeva che tutto nel nostro comando fosse a posto prima di WHERE parola chiave, o in altre parole fino al riferimento della tabella. Osservando la grammatica, vediamo che table_reference deve essere seguito da SET parola chiave:mentre nel nostro comando era effettivamente seguito da WHERE parola chiave. Questo spiega perché il parser segnala che si è verificato un problema a quel punto.

    Una nota di prenotazione

    Naturalmente, questo era un semplice esempio. Tuttavia, seguendo i due passaggi descritti sopra (ovvero osservando esattamente dove nel comando il parser ha riscontrato che la grammatica è stata violata e ha confrontato con la descrizione del manuale di cosa ci si aspettava a quel punto ), praticamente ogni errore di sintassi può essere facilmente identificato.

    Dico "praticamente tutto", perché c'è una piccola classe di problemi che non sono così facili da individuare, ed è qui che il parser crede che l'elemento del linguaggio incontrato significhi una cosa mentre tu intendi significarne un'altra. Prendi il seguente esempio:

    UPDATE my_table SET where='foo'
    

    Ancora una volta, il parser non si aspetta di incontrare WHERE a questo punto e così verrà sollevato un errore di sintassi simile, ma non avevi inteso per quel where essere una parola chiave SQL:avevi inteso che identificasse una colonna da aggiornare! Tuttavia, come documentato in Nomi oggetti schema :

    Se un identificatore contiene caratteri speciali o è una parola riservata, devi citalo ogni volta che ti riferisci ad esso. (Eccezione:una parola riservata che segue un punto in un nome qualificato deve essere un identificatore, quindi non è necessario virgolettarla.) Le parole riservate sono elencate in Sezione 9.3, «Parole chiave e parole riservate» .

    [ deletia ]

    Il carattere della virgoletta identificativa è il backtick ("` ”):

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

    Se il ANSI_QUOTES La modalità SQL è abilitata, è anche consentito citare gli identificatori tra virgolette doppie:

    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)