如何修复MySQL错误#1064?
当向MySQL发出命令时,我得到了错误#1064“语法错误”如何修复MySQL错误#1064?,mysql,parsing,syntax,syntax-error,mysql-error-1064,Mysql,Parsing,Syntax,Syntax Error,Mysql Error 1064,当向MySQL发出命令时,我得到了错误#1064“语法错误” 这是什么意思 我怎样才能修好它 TL;博士 错误#1064表示MySQL无法理解您的命令。要解决此问题,请执行以下操作: 阅读错误消息。它准确地告诉您MySQL在您的命令中被混淆的地方 检查您的命令。如果您使用编程语言创建命令,请使用echo、console.log(),或其等效工具来显示整个命令,以便您可以看到它 查看手册。与MySQL当时的预期相比,问题往往是显而易见的 检查保留字。如果对象标识符出现错误,请检查它是否为保留字(
- 阅读错误消息。它准确地告诉您MySQL在您的命令中被混淆的地方
- 检查您的命令。如果您使用编程语言创建命令,请使用
、echo
,或其等效工具来显示整个命令,以便您可以看到它console.log()
- 查看手册。与MySQL当时的预期相比,问题往往是显而易见的
- 检查保留字。如果对象标识符出现错误,请检查它是否为保留字(如果为保留字,请确保正确引用)
- 你说的这个“语法”是什么?是巫术吗? 虽然“语法”是许多程序员只在计算机环境中遇到的一个词,但实际上它是从更广泛的语言学中借用来的。它指的是句子结构:即语法规则;或者,换句话说,定义在语言中构成有效句子的规则 例如,以下英语句子包含语法错误(因为不定冠词“a”必须始终位于名词之前): 这个句子包含语法错误a
- 这与MySQL有什么关系? 每当一个人向计算机发出命令时,它必须做的第一件事就是“解析”该命令,以便理解它。“语法错误”意味着解析器无法理解所请求的内容,因为它不构成语言中的有效命令:换句话说,该命令违反了编程语言的语法 需要注意的是,计算机必须先理解命令,然后才能对其执行任何操作。因为有一个语法错误,MySQL不知道要找什么,因此在查看数据库之前就放弃了,因此模式或表内容不相关
- 读留言!
MySQL不仅告诉我们解析器遇到语法错误的确切位置,而且还提出了修复它的建议。例如,考虑下面的SQL命令:
该命令产生以下错误消息:更新my_表,其中id=101 SET name='foo'
MySQL告诉我们,在单词错误1064(42000):您的SQL语法有错误;检查与您的MySQL服务器版本对应的手册,以了解第1行“WHERE id=101 SET name='foo''附近要使用的正确语法
之前,一切似乎都很好,但是后来遇到了一个问题。换句话说,它不希望在那一点上遇到WHERE
在第…行的“”附近显示WHERE
…的消息只是表示意外遇到了命令结束:也就是说,在命令结束之前应该出现其他内容
- 检查命令的实际文本!
程序员通常使用编程语言创建SQL命令。例如,一个php程序可能有这样一行(错误的):
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 ;
如果你把它写成两行$result=$mysqli->query(“更新”。$tablename。“SET name='foo'其中id=101”);
然后可以添加$query=“更新”$tablename.“SET name='foo'其中id=101” $result=$mysqli->query($query);
或echo$query
查看查询是否实际显示var\u dump($query)
通常,您会立即看到错误,并能够修复它updateuserset name='foo'其中id=101
- 服从命令!
MySQL还建议我们“检查与MySQL版本对应的手册,以获得正确的语法使用”。让我们这样做吧
我使用的是MySQL v5.6,因此我将转向。页面上的第一件事是命令的语法(对于每个命令都是如此):
本手册解释了如何在下解释此语法,但就我们的目的而言,足以认识到:方括号中包含的子句更新[低优先级][忽略]表格参考 设置col_name1={expr1|DEFAULT}[,col_name2={expr2|DEFAULT}]。。。 [WHEREWHERE\u条件] [由……订购] [限制行计数]
和[
是可选的;竖条]
表示备选方案;省略号|
表示为了简洁而省略,或者前面的条款可以重复 我们已经知道,解析器认为在…
关键字之前,或者在表引用之前,命令中的所有内容都是正常的。查看语法,我们看到WHERE
后面必须跟有table\u reference
关键字:而在我们的命令中,它后面实际上跟有SET
关键字。这就解释了为什么解析器是rWHERE
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;
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 ;