TL;DR
El error #1064 significa que MySQL no puede entender su comando. Para solucionarlo:
-
Lea el mensaje de error. Te dice exactamente en qué parte de tu comando MySQL se confundió.
-
Examine su comando. 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 puedas verlo. -
Consulte el manual. Al comparar con lo que MySQL esperaba en ese momento , el problema suele ser obvio.
-
Busca 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).
-
¡¡Aaaagh!! ¿Qué significa #1064 significa ?
Los mensajes de error pueden aparecer como galimatías, pero (a menudo) son increíblemente informativos y brindan detalles suficientes para identificar qué salió mal. Al comprender exactamente lo que MySQL le dice, puede armarse para solucionar cualquier problema de este tipo en el futuro.
Como en muchos programas, los errores de MySQL se codifican según el tipo del problema que ocurrió. Error #1064 es un error de sintaxis.
-
¿Qué es esa "sintaxis" de la que hablas? ¿Es brujería?
Si bien "sintaxis" es una palabra que muchos programadores solo encuentran en el contexto de las computadoras, de hecho se toma prestada de una lingüística más amplia. Se refiere a la estructura de la oración:es decir, las reglas de la gramática; o, en otras palabras, las reglas que definen lo que constituye una sentencia 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?
Cada vez que se emite 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 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 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 uno busca y, por lo tanto, se da por vencido antes incluso 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, uno necesita determinar cómo es que el comando viola la gramática de MySQL. Esto puede sonar bastante impenetrable, pero MySQL se está esforzando mucho para ayudarnos aquí. Todo lo que tenemos que hacer es...
-
¡Lee el mensaje!
MySQL no solo nos dice exactamente donde el analizador encontró el error de sintaxis, pero 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 la palabra
WHERE
, pero luego se encontró un problema. En otras palabras, no esperaba encontrarWHERE
en ese momento.Mensajes que dicen
...near '' at line...
simplemente significa 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 a menudo crean 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 lineas
$query = "UPDATE " . $tablename ."SET name='foo' WHERE id=101" $result = $mysqli->query($query);
entonces puedes agregar
echo $query;
ovar_dump($query)
para ver que la consulta realmente diceUPDATE userSET name='foo' WHERE id=101
A menudo verá su error inmediatamente y podrá solucionarlo.
-
¡Obedece las órdenes!
MySQL también recomienda que "revise el manual que corresponde a nuestra versión de MySQL para conocer la sintaxis correcta a usar ". Hagámoslo.
Estoy usando MySQL v5.6, así que recurriré a la entrada manual de esa versión para una
UPDATE
comando . Lo primero en la página es la gramática del comando (esto es cierto 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 bajo Convenciones tipográficas y sintácticas , pero para nuestros propósitos es suficiente reconocer que:cláusulas contenidas entre corchetes
[
y]
son opcionales; barras verticales|
indicar alternativas; y puntos suspensivos...
denota 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 del
WHERE
palabra clave, es decir, hasta la referencia de la tabla inclusive. Mirando la gramática, vemos quetable_reference
debe ir seguido delSET
palabra clave:mientras que en nuestro comando en realidad fue seguido porWHERE
palabra clave. Esto explica por qué el analizador informa que se encontró un problema en ese momento.
Una nota de reserva
Por supuesto, este era un ejemplo simple. Sin embargo, siguiendo los dos pasos descritos anteriormente (es decir, observando exactamente dónde en el comando el analizador encontró que se había violado la gramática y la comparó 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 otra. Tome el siguiente ejemplo:
UPDATE my_table SET where='foo'
Nuevamente, el analizador no espera encontrar
WHERE
en este punto, generará un error de sintaxis similar, pero no tenía la intención de quewhere
para ser una palabra clave de SQL:¡tenía la intención de 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 Cítelo cada vez que se refiera 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 Sección 9.3, “Palabras clave y palabras reservadas” .
[ deletia ]
El carácter de comillas del identificador es el acento grave (“
`
”):mysql> SELECT * FROM `select` WHERE `select`.id > 100;
Si el
ANSI_QUOTES
El modo SQL está habilitado, también se permite 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)
-