Como posso corrigir o erro de MySQL # 1064?

ao emitir um comando para o MySQL, estou a obter o erro # 1064 "erro de sintaxe".

  1. o que significa?

  2. Como posso consertá-lo?

Author: eggyal, 2014-05-07

6 answers

TL; DR

Erro # 1064 significa que o MySQL não consegue entender o seu comando. Para consertar:
  • Leia a mensagem de erro.Isso diz-te exactamente onde no teu comando o MySQL ficou confuso.

  • Verifica o manual. comparando com o que o MySQL esperava naquele ponto , o problema é frequentemente óbvio.

  • Verifique para palavras reservadas. Se o erro ocorreu em um identificador de objeto, verifique que não é uma palavra reservada (e, se for, certifique-se de que é corretamente Citado).

  1. Aaaagh!! O que significa o #1064 ? As mensagens de erro podem parecer gobbledygook, mas são (muitas vezes) incrivelmente informativas e fornecem detalhes suficientes para identificar o que correu mal. Ao entender exatamente o que MySQL está lhe dizendo, Você pode armar-se para resolver qualquer problema deste tipo no futuro.

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

    • Que "sintaxe" é essa de que falas? É bruxaria?

      Embora "sintaxe" seja uma palavra que muitos programadores só encontram no contexto dos computadores, é de facto emprestada da linguística mais ampla. Refere-se à estrutura de frases: isto é as regras da gramática ; ou, em outros palavras, as regras que definem o que constitui uma sentença 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 um erro de sintaxe A.

    • O que é que isso tem a ver com o MySQL? Sempre que alguém emite um comando para um computador, uma das primeiras coisas que deve fazer é "analisar" isso. comando para dar sentido a isto. Um "erro de sintaxe" significa que o analisador é incapaz de compreender o que está sendo perguntado porque ele não constituem um comando válido na linguagem: em outras palavras, o comando viola a gramática da linguagem de programação. É importante notar que o computador tem de compreender o comando antes de poder fazer alguma coisa com ele. Porque há um erro de sintaxe, MySQL não tem idéia do que se está atrás e, portanto, desiste antes mesmo de olhar para a base de dados e, portanto, o esquema ou o conteúdo do índice do índice não são relevantes.
  2. Como é que o arranjo? Obviamente, é preciso determinar como é que o comando viola a gramática de MySQL. Isto pode parecer bastante impenetrável, mas o MySQL está a esforçar-se muito para nos ajudar. Tudo o que precisamos de fazer é...
    • Leia a mensagem!

      MySQL não só nos diz exactamente 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 produz 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á a dizer-nos que tudo parecia bem até à palavra, mas depois foi encontrado um problema. Por outras palavras, não esperava encontrar-se naquele momento.

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

    • Obedeçam às ordens!

      O MySQL também recomenda que nós " verifique o manual que corresponde à nossa versão do MySQL para obter a sintaxe certa para usar ". Vamos fazer isso.

      Estou a usar o MySQL v5. 6, por isso vou voltar para a entrada manual dessa versão para um comando UPDATE . A primeira coisa na página é a gramática do comando (isto é verdadeiro para cada comando):

      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 esta sintaxe em Tipográficos e Convenções de Sintaxe, mas para nossos propósitos, é suficiente reconhecer que: as cláusulas contidas dentro de colchetes [ e ] são opcionais; barras verticais | indicar alternativas; e elipses ... denotar uma omissão por questões de brevidade, ou que a cláusula anterior poderá ser repetido.

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

    Uma nota de reserva

    É claro que este foi um exemplo simples. No entanto, seguindo as duas etapas delineadas acima (isto é, observando exatamente onde no comando O analisador encontrou a gramática a ser violada e comparando com a descrição do manual de O que era esperado naquele ponto), praticamente todos os erros de sintaxe podem ser facilmente identificados. Eu digo "praticamente tudo", porque há uma pequena classe de problemas que não são muito fáceis de detectar-e é aí que o analisador acredita que o elemento de linguagem encontrado significa uma coisa enquanto você pretende que isso signifique outro. Tome o seguinte exemplo:
    UPDATE my_table SET where='foo'
    

    De Novo, o analisador não espera encontrar WHERE neste ponto, e então vai levantar uma sintaxe semelhante erro-mas você não tinha a intenção de que o where para ser uma palavra-chave SQL: você tinha a intenção de identificar uma coluna para atualizar! No entanto, tal como documentado em esquema nomes de objectos:

    Se um identificador contém caracteres especiais ou é uma palavra reservada, você deve citá-lo sempre que se referir a ele. (Exception: A reserved word that follows a period in a qualified name must be an identifier, so it need to be quoted.) As palavras reservadas estão listadas na secção 9.3 ([166]), "palavras-chave e palavras reservadas"([68]).

    [ deletia ]

    O carácter de citação do identificador é o backtick ("`"):

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

    ANSI_QUOTES o modo SQL está activo, sendo também permitido citar identificadores com 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)
 98
Author: eggyal, 2018-07-14 12:12:15

Se você receber o erro com o SQuirreL Client ao executar um SQL rxpression com um ponto-e-vírgula Como criar procedimento, então você precisa do plugin MySQL. Você pode selecioná-lo no install. Não é selecionado por padrão.

 0
Author: Horcrux7, 2016-10-26 09:08:37

Para o meu caso, eu estava a tentar executar o código de procedimento no MySQL, e devido a algum problema com o servidor no qual o servidor não consegue descobrir onde terminar a declaração Eu estava a obter o código de erro 1064. Então eu embrulhei o procedimento com separador personalizado e funcionou bem.

Por exemplo, antes de ser:

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 delimitador, 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 ;
 0
Author: Umair Malhi, 2017-04-19 10:54:27

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

UPDATE myTable SET myJSONfield = {};

Muda para

UPDATE myTable SET myJSONfield = '{}';
 0
Author: Andrew, 2017-05-01 20:17:25
Por várias razões.. por exemplo, se declararmos qualquer variável, então deve ser antes de qualquer outro tipo de declarações. ou então temos de começar 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á um erro por isso precisamos de o fazer

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
Author: user5493732, 2017-08-08 09:31:40

Pode ser porque o seu texto ou dados inseridos contêm uma única citação ' {[4] } pode tentar

mysql_real_escape_string() for mysql or mysqli_real_escape_string() for mysqli

Função para escapar do texto ao inserir os dados (inserir pesquisa) na base de dados.

 0
Author: Hussnain sheikh, 2018-03-09 17:58:49