当向MySQL发出命令时,我得到了错误#1064“语法错误”
-
这是什么意思
-
我怎样才能修好它
TL;博士
错误#1064表示MySQL无法理解您的命令。要解决此问题,请执行以下操作:
阅读错误消息。它告诉您您的命令中的确切位置MySQL被弄糊涂了
检查您的命令。如果您使用编程语言创建命令,请使用
echo
、console.log()
,或其等效项来显示整个命令,以便查看查看手册。通过与MySQL当时的预期进行比较,问题往往是显而易见的
检查保留字。如果对象标识符出现错误,请检查它是否为保留字(如果为保留字,请确保正确引用)
-
啊!!#1064是什么意思
错误消息可能看起来像gobbledygook,但它们(通常)提供了难以置信的信息,并提供了足够的详细信息来查明错误所在。通过准确理解MySQL告诉您的内容,您可以武装自己在将来解决任何此类问题
与许多程序一样,MySQL错误是根据所发生问题的类型进行编码的。错误#1064是一个语法错误
-
你说的这个“语法”是什么?是巫术吗
虽然“语法”是许多程序员只在计算机环境中遇到的一个词,但实际上它是从更广泛的语言学中借用来的。它指的是句子结构:即语法规则;或者,换句话说,定义语言中有效句子的规则
例如,以下英语句子包含语法错误(因为不定冠词“a”必须始终位于名词之前):
这个句子包含语法错误a
-
这与MySQL有什么关系
每当一个人向计算机发出命令时,它必须做的第一件事就是“解析”该命令,以便理解它。“语法错误”意味着解析器无法理解所请求的内容,因为它不构成语言中的有效命令:换句话说,该命令违反了编程语言的语法
需要注意的是,计算机必须先理解命令,然后才能对其执行任何操作。由于存在语法错误,MySQL不知道要查找什么,因此在查看数据库之前就放弃了,因此架构或表内容不相关
-
-
我怎么修理它
显然,我们需要确定该命令是如何违反MySQL语法的。这听起来可能很难理解,但MySQL正在努力帮助我们。我们需要做的就是&hellip
-
读留言
MySQL不仅准确地告诉我们解析器在哪里遇到语法错误,而且还提出了修复它的建议。例如,考虑下面的SQL命令:
更新我的表格,其中id=101 SET name='foo'
该命令产生以下错误消息:
错误1064(42000):您的SQL语法有错误;检查与您的MySQL服务器版本对应的手册,以了解第1行“WHERE id=101 SET name='foo''附近要使用的正确语法
MySQL告诉我们,在单词
WHERE
之前,一切似乎都很好,但是后来遇到了一个问题。换句话说,它不希望在那一点上遇到WHERE
在第…行的“”附近显示
…的消息只是表示意外遇到了命令结束:也就是说,在命令结束之前应该出现其他内容
-
检查命令的实际文本
程序员通常使用编程语言创建SQL命令。例如,一个php程序可能有这样一行(错误的):
$result=$mysqli->;查询(“更新”。$tablename。“SET name='foo'其中id=101”);
如果你把它写成两行
$query=“UPDATE”$tablename.“SET name='foo'其中id=101” $result=$mysqli->;查询($query);
然后可以添加
echo$query
或var\u dump($query)
查看查询是否实际显示更新用户名class='foo',其中id=101
通常,您会立即看到错误,并能够修复它
-
服从命令
MySQL还建议我们“检查与MySQL版本相对应的手册,以获得正确的语法使用方法”。让我们这样做吧
我使用的是MySQL v5.6,因此我将使用该版本的手动条目执行
UPDATE
命令。页面上的第一件事是命令的语法(对于每个命令都是如此):更新[低优先级][忽略]表参考 设置列名1={expr1|DEFAULT}[,列名2={expr2|DEFAULT}]。。。 [WHEREWHERE\u条件] [由……订购] [限制行数]
本手册解释了如何在排版和语法约定下解释此语法,但就我们的目的而言,足以认识到:方括号中包含的子句
[
和]
是可选的;竖条|
表示备选方案;省略号…
表示为了简洁而省略,或者前面的条款可以重复我们已经知道,解析器认为在
WHERE
关键字之前,或者在表引用之前,命令中的所有内容都是正常的。查看语法,我们看到表参考
后面必须跟有SET
关键字:而在我们的命令中,它后面实际上跟有WHERE
关键字。这就解释了为什么解析器会报告此时遇到了问题
保留意见
当然,这是一个简单的例子。但是,通过遵循上面概述的两个步骤(即观察命令中语法被违反的确切位置,并与手册中对在该点预期的内容进行比较),几乎可以很容易地识别出每一个语法错误
我说“几乎所有”,是因为有一小部分问题不太容易发现—这就是解析器认为遇到的语言元素意味着一件事,而您希望它意味着另一件事。以以下为例:
更新我的表格集,其中class='foo'
同样,解析器不希望在此时遇到
WHERE
,因此将引发类似的语法错误—但您并没有打算让where
成为SQL关键字:您本来打算让它标识一个要更新的列!但是,如架构对象名称下所述:如果标识符包含特殊字符或是保留字,则无论何时引用它,都必须对其进行引用。(例外:限定名称中句点后的保留字必须是标识符,因此无需引用。)保留字在第9.3节“关键字和保留字”中列出
[deletia]
标识符引号字符是反勾号(“
`
”):mysql>SELECT*从`SELECT`中选择`SELECT`.id>100
如果启用了
ANSI_QUOTES
SQL模式,也允许在双引号内引用标识符:mysql>创建表“测试”(col INT) 错误1064:您的SQL语法有错误。。。 mysql>设置sql_mode='ANSI_QUOTES' mysql>创建表“测试”(col INT) 查询正常,0行受影响(0.00秒)
-