¿Cómo puedo solucionar el error n.º 1064 de MySQL?
Al emitir un comando a MySQL, aparece el error n.º 1064 "error de sintaxis".
¿Qué significa?
¿Cómo puedo arreglarlo?
TL;DR
El error #1064 significa que MySQL no puede entender su comando. Arreglarlo:
Lea el mensaje de error. Le indica exactamente en qué parte de su comando se confundió MySQL.
Examina tu mando. Si usa un lenguaje de programación para crear su comando, use
echo
,console.log()
o su equivalente para mostrar el comando completo para que pueda verlo.Consulta el manual. Al compararlo con lo que MySQL esperaba en ese momento , el problema suele ser obvio.
Busque palabras reservadas. Si el error ocurrió en un identificador de objeto, verifique que no sea una palabra reservada (y, si lo es, asegúrese de que esté entre comillas correctamente).
¡¡Aaaaaaaa!! ¿Qué significa el número 1064 ?
Los mensajes de error pueden parecer una palabrería, pero (a menudo) son increíblemente informativos y brindan suficientes detalles para identificar qué salió mal. Al comprender exactamente lo que MySQL le dice, podrá prepararse para solucionar cualquier problema de este tipo en el futuro.
Como en muchos programas, los errores de MySQL se codifican según el tipo de problema ocurrido. El error n.º 1064 es un error de sintaxis.
¿Qué es esa "sintaxis" de la que hablas? ¿Es brujería?
Aunque "sintaxis" es una palabra que muchos programadores sólo encuentran en el contexto de los ordenadores, en realidad está tomada de una lingüística más amplia. Se refiere a la estructura de la oración: es decir, las reglas gramaticales ; o, en otras palabras, las reglas que definen lo que constituye una oración válida dentro del idioma.
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?
Siempre que uno envía un comando a una computadora, una de las primeras cosas que debe hacer es "analizar" ese comando para darle sentido. Un "error de sintaxis" significa que el analizador no puede entender lo que se le pide 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 la computadora debe comprender el comando antes de poder hacer algo 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.
¿Cómo lo soluciono?
Obviamente, es necesario determinar cómo es que el comando viola la gramática de MySQL. Esto puede parecer bastante impenetrable, pero MySQL se está esforzando mucho por ayudarnos aquí. Todo lo que tenemos que hacer es…
¡Leer el mensaje!
MySQL no sólo nos dice exactamente dónde encontró el analizador el error de sintaxis, sino que también hace una sugerencia para solucionarlo. 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 el momento
WHERE
, pero luego se encontró un problema. En otras palabras, no esperaba encontrarseWHERE
en ese momento.Los mensajes que dicen
...near '' at line...
simplemente significan que el final del comando se encontró inesperadamente: es decir, algo más debería aparecer antes de que finalice el comando.¡Examine el texto real de su comando!
Los programadores suelen crear comandos SQL utilizando un lenguaje de programación. Por ejemplo, un programa php podría tener una línea (incorrecta) como esta:
$result = $mysqli->query("UPDATE " . $tablename ."SET name='foo' WHERE id=101");
Si escribes esto esto en dos líneas.
$query = "UPDATE " . $tablename ."SET name='foo' WHERE id=101" $result = $mysqli->query($query);
luego puedes agregar
echo $query;
ovar_dump($query)
para ver que la consulta realmente diceUPDATE userSET name='foo' WHERE id=101
A menudo verá el error inmediatamente y podrá solucionarlo.
¡Obedece las órdenes!
MySQL también recomienda que " consulte el manual que corresponde a nuestra versión de MySQL para conocer la sintaxis correcta a utilizar ". Vamos a hacer eso.
Estoy usando MySQL v5.6, así que recurriré a la entrada manual de esa versión para obtener un
UPDATE
comando . Lo primero que aparece en la página es la gramática del comando (esto es válido para todos los comandos):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 según las convenciones tipográficas y de sintaxis , 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
WHERE
palabra clave, o en otras palabras, hasta la referencia de la tabla incluida. Al observar la gramática, vemos quetable_reference
debe ir seguido de laSET
palabra clave: mientras que en nuestro comando en realidad iba seguido de laWHERE
palabra clave. Esto explica por qué el analizador informa que se encontró un problema en ese momento.
Una nota de reserva
Por supuesto, este fue un ejemplo simple. Sin embargo, al seguir los dos pasos descritos anteriormente (es decir, observar exactamente en qué parte del comando el analizador encontró que se violaba la gramática y compararla con la descripción del manual de lo que se esperaba en ese punto ), 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 del lenguaje encontrado significa una cosa mientras que usted pretende que signifique otra. Tomemos el siguiente ejemplo:
UPDATE my_table SET where='foo'
Nuevamente, el analizador no espera encontrar
WHERE
este punto y, por lo tanto, generará un error de sintaxis similar, pero usted no tenía la intención de quewhere
fuera una palabra clave SQL: ¡la intención era 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, deberá citarlo cada vez que haga referencia a él. (Excepción: una palabra reservada que sigue a un punto en un nombre calificado debe ser un identificador, por lo que no es necesario citarla). Las palabras reservadas se enumeran en la Sección 9.3, “Palabras clave y palabras reservadas” .
[ eliminar ]
El carácter de comilla identificador es la comilla invertida (“
`
”):mysql> SELECT * FROM `select` WHERE `select`.id > 100;
Si el
ANSI_QUOTES
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)
Es tarde, pero ayudará a otros y, por supuesto, ahorrará tiempo :) Mi consulta funcionaba en MySQL 5.7 en el sistema local, pero en vivo tenemos la versión MySQL 8 y la consulta dejó de funcionar.
Consulta:
SELECT t.*
FROM groups t
ORDER BY t.id DESC
LIMIT 10 OFFSET 0
Salida en MySQL 8:
Error en la consulta (1064): error de sintaxis cerca de 'grupos t ORDER BY t.id DESC' en la línea...
Descubrí groups
que es una palabra reservada, por lo que tengo que ajustar los grupos con `` comillas o cambiar el nombre de la tabla para resolver este problema.
En mi caso, estaba intentando ejecutar el código de procedimiento en MySQL y, debido a algún problema con el servidor en el que el servidor no puede determinar dónde terminar la declaración, recibí el código de error 1064. Así que envolví el procedimiento con DELIMITER 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 DELIMITER quedó 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 ;