TL;DR
Error #1064 means that MySQL can’t understand your command. To fix it:
Read the error message. It tells you exactly where in your command MySQL got confused.
Examine your command. If you use a programming language to create your command, use echo, console.log(), or its equivalent to show the entire command so you can see it.
Check the manual. By comparing against what MySQL expected at that point, the problem is often obvious.
Check for reserved words. If the error occurred on an object identifier, check that it isn’t a reserved word (and, if it is, ensure that it’s properly quoted).
> Aaaagh !! #1064是什么意思?
错误消息可能看起来像gobbledygook,但它们(通常)提供了令人难以置信的信息,并提供足够的细节来查明出错的地方.通过准确理解MySQL告诉你的内容,你可以在未来武装自己解决这类问题.
与许多程序一样,MySQL错误根据发生的问题类型进行编码. Error #1064是语法错误.
>你说的这个“语法”是什么?这是巫术吗?
虽然“语法”是许多程序员只在计算机环境中遇到的一个词,但它实际上是从更广泛的语言学中借用的.它指的是句子结构:即语法规则;或者换句话说,定义什么构成语言中的有效句子的规则.
例如,以下英语句子包含语法错误(因为不定冠词“a”必须始终位于名词之前):
This sentence contains syntax error a.
>这与MySQL有什么关系?
每当向计算机发出命令时,它必须做的第一件事就是“解析”该命令以便理解它. “语法错误”意味着解析器无法理解所请求的内容,因为它不构成语言中的有效命令:换句话说,该命令违反了编程语言的语法.
重要的是要注意,计算机必须先了解该命令才能对其执行任何操作.因为存在语法错误,所以MySQL不知道后者是什么,因此在它甚至查看数据库之前放弃,因此架构或表内容不相关.
>我该如何解决?
显然,需要确定命令违反MySQL语法的方式.这可能听起来非常难以理解,但MySQL正在努力帮助我们.我们需要做的就是……
>阅读消息!
MySQL不仅告诉我们解析器遇到语法错误的确切位置,还提出修复它的建议.例如,请考虑以下SQL命令:
UPDATE my_table WHERE id=101 SET name='foo'
该命令产生以下错误消息:
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告诉我们一切似乎都很好,直到单词WHERE,但遇到了问题.换句话说,它并不期望在那时遇到WHERE.
说’在线’附近的消息…只是意味着意外地遇到了命令的结束:也就是说,在命令结束之前应该出现其他东西.
>检查命令的实际文本!
程序员经常使用编程语言创建SQL命令.例如,php程序可能有一个(错误的)行,如下所示:
$result = $mysqli->query("UPDATE " . $tablename ."SET name='foo' WHERE id=101");
如果你用两行写这个
$query = "UPDATE " . $tablename ."SET name='foo' WHERE id=101"
$result = $mysqli->query($query);
然后你可以添加echo $query;或者var_dump($query)查看查询实际上是什么
UPDATE userSET name='foo' WHERE id=101
通常,您会立即看到错误并能够修复它.
>服从订单!
MySQL还建议我们“检查与我们的MySQL版本相对应的手册,以便使用正确的语法”.我们这样做.
我正在使用MySQL v5.6,所以我将转向that version’s manual entry for an UPDATE command.页面上的第一件事就是命令的语法(对于每个命令都是如此):
UPDATE [LOW_PRIORITY] [IGNORE] table_reference
SET col_name1={expr1|DEFAULT} [, col_name2={expr2|DEFAULT}] ...
[WHERE where_condition]
[ORDER BY ...]
[LIMIT row_count]
该手册解释了如何在Typographical and Syntax Conventions下解释这种语法,但出于我们的目的,它足以认识到:方括号[和]中包含的子句是可选的;竖条|表明替代品;和省略号……表示为了简洁而省略,或者可以重复前面的条款.
我们已经知道解析器认为我们命令中的所有内容在WHERE关键字之前都是正常的,或者换句话说直到并包括表引用.查看语法,我们看到table_reference必须后跟SET关键字:而在我们的命令中,实际上后面跟着WHERE关键字.这解释了解析器报告此时遇到问题的原因.
保留说明
当然,这是一个简单的例子.然而,通过遵循上面概述的两个步骤(即,在命令中确切地观察解析器发现语法被违反的位置并且与手册对该点的预期描述进行比较),实际上可以容易地识别每个语法错误.
我说“几乎所有”,因为有一小部分问题不太容易被发现 – 而且解析器认为遇到的语言元素意味着一件事,而你打算意味着另一件事.请看以下示例:
UPDATE my_table SET where='foo'
同样,解析器不期望在此时遇到WHERE,因此会引发类似的语法错误 – 但您并不打算将其作为SQL关键字的位置:您原本打算用它来标识要更新的列!但是,如Schema Object Names所述:
If an identifier contains special characters or is a reserved word, you must quote it whenever you refer to it. (Exception: A reserved word that follows a period in a qualified name must be an identifier, so it need not be quoted.) Reserved words are listed at 07004.
06006
The identifier quote character is the backtick (“`”):
06007
If the 07005 SQL mode is enabled, it is also permissible to quote identifiers within double quotation marks:
06008