Como posso corrigir o erro # 1064 do MySQL?

Ao emitir um comando para o MySQL, estou recebendo o erro # 1064 “erro de syntax”.

  1. O que isso significa?

  2. Como posso consertar isso?

TL; DR

Erro # 1064 significa que o MySQL não consegue entender seu comando. Para fixar isso:

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

  • Verifique o manual. Ao comparar o que o MySQL esperava naquele momento , o problema é geralmente óbvio.

  • Verifique se há palavras reservadas. Se o erro ocorreu em um identificador de object, verifique se não é uma palavra reservada (e, se estiver, certifique-se de que esteja corretamente entre aspas).

  1. Aaaagh !! O que significa o # 1064?

    As mensagens de erro podem parecer com gobbledygook, mas são (muitas vezes) incrivelmente informativas e fornecem detalhes suficientes para identificar o que deu errado. Entendendo exatamente o que o MySQL está lhe dizendo, você pode armar-se para consertar qualquer problema deste tipo no futuro.

    Como em muitos programas, os erros do MySQL são codificados de acordo com o tipo de problema que ocorreu. Erro # 1064 é um erro de syntax.

    • O que é essa “syntax” da qual você fala? Isso é feitiçaria?

      Enquanto “syntax” é uma palavra que muitos programadores encontram apenas no contexto de computadores, ela é, na verdade, emprestada da linguística mais ampla. Refere-se à estrutura da sentença: isto é, as regras da gramática ; ou, em outras palavras, as regras que definem o que constitui uma sentença válida dentro do idioma.

      Por exemplo, a seguinte sentença em inglês contém um erro de syntax (porque o artigo indefinido “a” sempre deve preceder um substantivo):

      Esta frase contém erro de syntax 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 a fim de dar sentido a ele. Um “erro de syntax” significa que o analisador não consegue entender o que está sendo solicitado porque não constitui um comando válido dentro do idioma: 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 syntax, o MySQL não faz idéia do que é depois e, portanto, desiste antes mesmo de olhar para o database e, portanto, o conteúdo do esquema ou da tabela não é relevante.

  2. Como faço para 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á tentando nos ajudar muito aqui. Tudo o que precisamos fazer é …

    • Leia a mensagem!

      O MySQL não apenas nos diz exatamente onde o analisador encontrou o erro de syntax, 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 um problema foi encontrado. Em outras palavras, não esperava encontrar WHERE naquele momento.

      Mensagens que dizem ...near '' at line... significam simplesmente que o fim do comando foi encontrado inesperadamente: isto é, algo mais deve aparecer antes que o comando termine.

    • Obedecer ordens!

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

      Eu estou usando o MySQL v5.6, então vou usar a input manual da versão para um comando UPDATE . A primeira coisa na página é a gramática do comando (isso vale 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 syntax nas 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 elipses ... denotam omissão por brevidade ou que a cláusula anterior pode ser repetida.

      Nós já sabemos que o analisador acreditava que tudo em nosso comando estava bem antes da palavra-chave WHERE , ou em outras palavras, até e incluindo a referência da tabela. Observando a gramática, vemos que table_reference deve ser seguido pela palavra-chave SET : enquanto em nosso comando ela foi realmente seguida pela palavra-chave WHERE . 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 a ser violada e comparando com a descrição do manual do que era esperado naquele ponto ), praticamente todo erro de syntax pode ser prontamente identificado.

    Eu digo “virtualmente todos”, porque há uma pequena class 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, assim, criará um erro de syntax semelhante – mas você não pretendia que where haver uma palavra-chave SQL: você tinha a intenção de identificar uma coluna para atualização! No entanto, conforme documentado em nomes de object de esquema :

    Se um identificador contiver caracteres especiais ou for uma palavra reservada, você deverá citá-lo sempre que se referir a ele. (Exceção: Uma palavra reservada que segue um período em um nome qualificado deve ser um identificador, portanto, não precisa ser citado.) As palavras reservadas são listadas na Seção 9.3, “Palavras-chave e palavras reservadas” .

      [ deletia ] 

    O caractere de cota identificador é o backtick (“ ` ”):

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

    Se o modo SQL ANSI_QUOTES estiver ativado, 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) 

Se você receber o erro com o SQuirreL Client ao executar uma rxpression SQL com um ponto-e-vírgula como o CREATE PROCEDURE, precisará do plugin MySQL. Você pode selecioná-lo na instalação. Não está selecionado por padrão.

Para o meu caso, eu estava tentando executar código de procedimento no MySQL, e devido a algum problema com o servidor no qual o servidor não conseguia descobrir onde encerrar a declaração eu estava recebendo o código de erro 1064. Então, encerrei o procedimento com DELIMITER personalizado e funcionou bem.

Por exemplo, antes disso:

 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; 

Depois de colocar o DELIMITER foi assim:

 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 ; 

Você também obtém esse erro quando está tentando inserir JSON ou outros dados com caracteres especiais, sem as aspas necessárias, por exemplo:

 UPDATE myTable SET myJSONfield = {}; 

mude para

 UPDATE myTable SET myJSONfield = '{}'; 

Várias razões para isso .. dizer por exemplo, se nós declarar qualquer variável, então deve ser antes de qualquer outro tipo de declarações. ou então precisamos colocar um bloco BEGIN antes disso.

 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; 

dá erro por isso precisamos fazer isso

 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 ; 

Pode ser que sua string ou dados inseridos contenham uma única citação ‘ você pode tentar

 mysql_real_escape_string() for mysql or mysqli_real_escape_string() for mysqli 

function para escaping da string ao inserir dados (inserir consulta) no database.