¿Cómo puedo corregir el error # 1064 de MySQL?


Al emitir un comando a MySQL, obtengo el error #1064 "error de sintaxis".

  1. ¿Qué significa?

  2. ¿Cómo puedo arreglarlo?

Author: eggyal, 2014-05-07

6 answers

TL;DR

El error #1064 significa que MySQL no puede entender su comando. Para arreglarlo:

  • Lea el mensaje de error. Te dice exactamente dónde en tu comando MySQL se confundió.

  • Revisa el manual. Comparando con lo que MySQL esperaba en ese momento, el problema es a menudo obvio.

  • Busca palabras reservadas. Si el error ocurrió en un identificador de objeto, compruebe que no es una palabra reservada (y, si lo es, asegúrese de que está correctamente citado).

  1. Aaaagh!! ¿Qué significa #1064 ?

    Los mensajes de error pueden parecer como jerigonza, pero son (a menudo) increíblemente informativos y proporcionan suficiente detalle para identificar qué salió mal. Al comprender exactamente lo que MySQL le está diciendo, puede armarse para solucionar cualquier problema de este tipo en el futuro.

    Al igual que en muchos programas, los errores de MySQL se codifican de acuerdo con el tipo del problema que se produjo. El error #1064 es un error de sintaxis.

    • ¿Qué es esta "sintaxis" de la que hablas? ¿Es brujería?

      Mientras que "sintaxis" es una palabra que muchos programadores solo encuentran en el contexto de las computadoras, de hecho está tomada de la lingüística más amplia. Se refiere a la estructura de la oración: es decir, las reglas de gramática ; o, en otros palabras, las reglas que definen lo que constituye una oración válida dentro del lenguaje.

      Por ejemplo, la siguiente oración en inglés contiene un error de sintaxis (porque el artículo indefinido "a" siempre debe preceder a un sustantivo):

      Esta oración contiene un error de sintaxis a.

    • ¿Qué tiene eso que ver con MySQL?

      Cada vez que uno emite un comando a una computadora, una de las primeras cosas que debe hacer es "analizar" que orden para darle sentido. Un "error de sintaxis" significa que el analizador es incapaz de entender lo que se le pregunta porque no constituye un comando válido dentro del lenguaje: en otras palabras, el comando viola la gramática del lenguaje de programación.

      Es importante tener en cuenta que el equipo debe entender el comando antes de poder hacer nada con él. Debido a que hay un error de sintaxis, MySQL no tiene idea de lo que se busca y, por lo tanto, se da por vencido incluso antes de mirar la base de datos y por lo tanto el esquema o el contenido de la tabla no son relevantes.

  2. ¿Cómo lo arreglo?

    Obviamente, uno necesita determinar cómo es que el comando viola la gramática de MySQL. Esto puede sonar bastante impenetrable, pero MySQL está intentando realmente ayudarnos aquí. Todo lo que tenemos que hacer es...

    • ¡Lee el mensaje!

      MySQL no solo nos dice exactamente donde el analizador sintáctico encontrado el error de sintaxis, pero también hace una sugerencia para arreglarlo. Por ejemplo, considere el siguiente comando SQL:

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

      Ese comando produce el siguiente mensaje de error:

      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 nos dice que todo parecía estar bien hasta la palabra WHERE, pero luego se encontró un problema. En otras palabras, no esperaba encontrarse WHERE en ese punto.

      Los mensajes que dicen ...near '' at line... simplemente significan que el fin del comando fue encontrado inesperadamente: es decir, algo más debería aparecer antes de que finalice el comando.

    • Obedecer órdenes!

      MySQL también recomienda que "revisemos el manual que corresponde a nuestra versión de MySQL para la sintaxis correcta a usar". Hagámoslo.

      Estoy usando MySQL v5.6, así que me dirigiré a la entrada manual de esa versión para un comando UPDATE . La primera cosa en la página es la gramática del comando (esto es cierto 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]
      

      El manual explica cómo interpretar esta sintaxis bajo Convenciones tipográficas y Sintácticas, pero para nuestros propósitos es suficiente reconocer que: las cláusulas contenidas entre corchetes [ y ] son opcionales; las barras verticales | indican alternativas; y las elipses ... denotan una omisión por brevedad, o que la cláusula anterior puede repetirse.

      Ya sabemos que el analizador creía que todo en nuestro comando estaba bien antes de la palabra clave WHERE, o en otras palabras hasta e incluyendo la referencia de la tabla. Mirando la gramática, vemos que table_reference debe ser seguido por la palabra clave SET: mientras que en nuestro comando fue seguido por la palabra clave WHERE. Esto explica por qué el analizador informa que se encontró un problema en ese punto.

    Una nota de reserva

    Por supuesto, este fue un ejemplo simple. Sin embargo, siguiendo los dos pasos descritos más arriba (es decir, observando exactamente dónde en el comando el analizador encontró que la gramática se violaba y comparando con la descripción del manual de lo que se esperaba en ese momento), prácticamente todos los errores de sintaxis se pueden identificar fácilmente.

    Digo "prácticamente todos", porque hay una pequeña clase de problemas que no son tan fáciles de detectar,y ahí es donde el analizador cree que el elemento de lenguaje encontrado significa una cosa mientras que usted pretende que signifique otro. Tomemos el siguiente ejemplo:

    UPDATE my_table SET where='foo'
    

    Nuevamente, el analizador no espera encontrar WHERE en este punto y por lo tanto generará un error de sintaxis similar, pero no había pensado que where fuera una palabra clave SQL: ¡había pensado que identificara una columna para actualizar! Sin embargo, como se documenta en Nombres de objetos de esquema :

    Si un identificador contiene caracteres especiales o es una palabra reservada, debe citarlo cada vez que se refiera a él. (Excepción: Una palabra reservada que sigue un punto en un nombre calificado debe ser un identificador, por lo que no es necesario citarla.) Las palabras reservadas se enumeran en Sección 9.3, "Palabras clave y Palabras reservadas".

    [ deletia ]

    El carácter de comilla de identificador es el backtick ("`"):

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

    Si el ANSI_QUOTES El modo SQL está habilitado, también está permitido citar identificadores entre comillas dobles:

    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,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-07-14 12:12:15

Si recibe el error con el cliente SQuirreL al ejecutar un SQL rxpression con un punto y coma como el PROCEDIMIENTO CREATE, entonces necesita el complemento MySQL. Puede seleccionarlo en la instalación. No está seleccionado de forma predeterminada.

 0
Author: Horcrux7,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-10-26 09:08:37

Para mi caso, estaba tratando de ejecutar código de procedimiento en MySQL, y debido a algún problema con el servidor en el que el Servidor no puede averiguar dónde terminar la instrucción, estaba obteniendo el Código de error 1064. Así que envolví el procedimiento con delimitador personalizado y funcionó bien.

Por ejemplo, Antes era:

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;

Después de poner DELIMITADOR fue así:

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,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-04-19 10:54:27

También obtiene este error cuando intenta insertar JSON u otros datos con caracteres especiales, sin las comillas necesarias, por ejemplo:

UPDATE myTable SET myJSONfield = {};

Cámbialo a

UPDATE myTable SET myJSONfield = '{}';
 0
Author: Andrew,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-01 20:17:25

Varias razones para ello.. por ejemplo, si declaramos cualquier variable, debería estar antes que cualquier otro tipo de declaraciones. o de lo contrario tenemos que poner un bloque BEGIN antes de eso.

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; 

Da error por lo que tenemos que hacerlo

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,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-08-08 09:31:40

Puede ser porque su cadena o datos insertados contienen una comilla simple ' puede probar

mysql_real_escape_string() for mysql or mysqli_real_escape_string() for mysqli

Función para escapar de la cadena mientras se insertan datos(insertar consulta) en la base de datos.

 0
Author: Hussnain sheikh,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-03-09 17:58:49