Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Como posso corrigir o erro #1064 do MySQL?

TL;DR


O erro #1064 significa que o MySQL não pode entender seu comando. Para fixar isso:

  • Leia a mensagem de erro. Ele informa exatamente onde em seu comando MySQL ficou confuso.

  • Examine seu comando. Se você usa uma linguagem de programação para criar seu comando, use echo , console.log() , ou seu equivalente para mostrar o comando inteiro para que você possa ver.

  • Verifique o manual. Ao comparar com o que o MySQL esperava naquele ponto , o problema é muitas vezes óbvio.

  • Verifique se há palavras reservadas. Se o erro ocorreu em um identificador de objeto, verifique se não é uma palavra reservada (e, se for, verifique se está entre aspas corretamente).
  1. Aaaah!! O que significa #1064 significa ?


    As mensagens de erro podem olhar como gobbledygook, mas eles são (geralmente) incrivelmente informativos e fornecem detalhes suficientes para identificar o que deu errado. Ao entender exatamente o que o MySQL está lhe dizendo, você pode se armar para corrigir qualquer problema desse tipo no futuro.

    Como em muitos programas, os erros do MySQL são codificados de acordo com o tipo de problema ocorrido. Erro nº 1064 é um erro de sintaxe.
    • O que é essa "sintaxe" da qual você fala? É feitiçaria?


      Embora "sintaxe" seja uma palavra que muitos programadores só encontram no contexto de computadores, na verdade ela é emprestada de uma linguística mais ampla. Refere-se à estrutura da frase:ou seja, as regras da gramática; ou, em outras palavras, as regras que definem o que constitui uma frase válida dentro da linguagem.

      Por exemplo, a seguinte frase em inglês contém um erro de sintaxe (porque o artigo indefinido "a" deve sempre preceder um substantivo):

      Esta frase contém erro de sintaxe a.
    • O que isso tem a ver com o MySQL?


      Sempre que alguém emite um comando para um computador, uma das primeiras coisas que ele deve fazer é "analisar" esse comando para dar sentido a ele. Um "erro de sintaxe" significa que o analisador não consegue entender o que está sendo solicitado porque não constitui um comando válido dentro da linguagem:em outras palavras, o comando viola a gramática da linguagem de programação .

      É importante observar que o computador deve entender o comando antes de poder fazer qualquer coisa com ele. Como há um erro de sintaxe, o MySQL não tem ideia do que está procurando e, portanto, desiste antes mesmo de olhar para o banco de dados e, portanto, o esquema ou o conteúdo da tabela não são relevantes.
  2. Como posso corrigir isso?


    Obviamente, é preciso determinar como é que o comando viola a gramática do MySQL. Isso pode parecer bastante impenetrável, mas o MySQL está se esforçando muito para nos ajudar aqui. Tudo o que precisamos fazer é…
    • Leia a mensagem!


      O MySQL não apenas nos diz exatamente onde o analisador encontrou o erro de sintaxe, mas também faz uma sugestão para corrigi-lo. Por exemplo, considere o seguinte comando SQL:
      UPDATE my_table WHERE id=101 SET name='foo'
      

      Esse comando gera a seguinte mensagem de erro:

      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

      O MySQL está nos dizendo que tudo parecia bem até a palavra WHERE , mas então foi encontrado um problema. Em outras palavras, não esperava encontrar WHERE nesse ponto.

      Mensagens que dizem ...near '' at line... simplesmente significa que o fim do comando foi encontrado inesperadamente:ou seja, algo mais deve aparecer antes que o comando termine.
    • Examine o texto real do seu comando!


      Os programadores geralmente criam comandos SQL usando uma linguagem de programação. Por exemplo, um programa php pode ter uma linha (errada) como esta:
      $result = $mysqli->query("UPDATE " . $tablename ."SET name='foo' WHERE id=101");
      

      Se você escrever isso em duas linhas
      $query = "UPDATE " . $tablename ."SET name='foo' WHERE id=101"
      $result = $mysqli->query($query);
      

      então você pode adicionar echo $query; ou var_dump($query) para ver que a consulta realmente diz
      UPDATE userSET name='foo' WHERE id=101
      

      Muitas vezes, você verá seu erro imediatamente e poderá corrigi-lo.
    • Obedeça às ordens!


      O MySQL também está recomendando que "verifiquemos o manual que corresponde à nossa versão do MySQL para a sintaxe correta a ser usada ". Vamos fazer isso.

      Estou usando o MySQL v5.6, então vou usar a entrada manual dessa versão para um UPDATE comando . A primeira coisa na página é a gramática do comando (isso é verdade para todos os comandos):
      UPDATE [LOW_PRIORITY] [IGNORE] table_reference
          SET col_name1={expr1|DEFAULT} [, col_name2={expr2|DEFAULT}] ...
          [WHERE where_condition]
          [ORDER BY ...]
          [LIMIT row_count]
      

      O manual explica como interpretar essa sintaxe em Convenções tipográficas e de sintaxe , mas para nossos propósitos é suficiente reconhecer que:cláusulas contidas entre colchetes [ e ] são opcionais; barras verticais | indicar alternativas; e reticências ... denotam uma omissão por brevidade ou que a cláusula anterior pode ser repetida.

      Já sabemos que o analisador acreditava que tudo em nosso comando estava bem antes do WHERE palavra-chave, ou em outras palavras até e incluindo a referência da tabela. Observando a gramática, vemos que table_reference deve ser seguido pelo SET palavra-chave:enquanto em nosso comando foi realmente seguido pelo WHERE palavra-chave. Isso explica por que o analisador relata que um problema foi encontrado nesse ponto.

    Uma nota de reserva


    Claro, este foi um exemplo simples. No entanto, seguindo as duas etapas descritas acima (ou seja, observando exatamente onde no comando o analisador encontrou a gramática violada e comparando com a descrição do manual do o que era esperado naquele ponto ), praticamente todos os erros de sintaxe podem ser prontamente identificados.

    Digo "praticamente todos", porque há uma pequena classe de problemas que não são tão fáceis de detectar - e é aí que o analisador acredita que o elemento de linguagem encontrado significa uma coisa enquanto você pretende que signifique outra. Tome o seguinte exemplo:
    UPDATE my_table SET where='foo'
    

    Novamente, o analisador não espera encontrar WHERE neste ponto e, portanto, gerará um erro de sintaxe semelhante - mas você não pretendia que where para ser uma palavra-chave SQL:você pretendia que ela identificasse uma coluna para atualização! No entanto, conforme documentado em Nomes de objetos de esquema :

    Se um identificador contém caracteres especiais ou é uma palavra reservada, você deve citá-lo sempre que você se referir a ele. (Exceção:uma palavra reservada que segue um ponto em um nome qualificado deve ser um identificador, portanto, não precisa ser citada.) As palavras reservadas estão listadas em Seção 9.3, “Palavras-chave e palavras reservadas” .
    [ deletia ]

    O caractere de aspas identificador é o backtick (“` ”):
    mysql> SELECT * FROM `select` WHERE `select`.id > 100;

    Se o ANSI_QUOTES O modo SQL está habilitado, também é permitido citar identificadores entre aspas duplas:


    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)