如何修复MySQL错误#1064?

当向MySQL发出命令时,我得到了错误#1064“语法错误”

  1. 这是什么意思

  2. 我怎样才能修好它

TL;博士

错误#1064表示MySQL无法理解您的命令。要解决此问题,请执行以下操作:

  • 阅读错误消息。它告诉您您的命令中的确切位置MySQL被弄糊涂了

  • 检查您的命令。如果您使用编程语言创建命令,请使用echoconsole.log(),或其等效项来显示整个命令,以便查看

  • 查看手册。通过与MySQL当时的预期进行比较,问题往往是显而易见的

  • 检查保留字。如果对象标识符出现错误,请检查它是否为保留字(如果为保留字,请确保正确引用)

  1. 啊!!#1064是什么意思

    错误消息可能看起来像gobbledygook,但它们(通常)提供了难以置信的信息,并提供了足够的详细信息来查明错误所在。通过准确理解MySQL告诉您的内容,您可以武装自己在将来解决任何此类问题

    与许多程序一样,MySQL错误是根据所发生问题的类型进行编码的。错误#1064是一个语法错误

    • 你说的这个“语法”是什么?是巫术吗

      虽然“语法”是许多程序员只在计算机环境中遇到的一个词,但实际上它是从更广泛的语言学中借用来的。它指的是句子结构:即语法规则;或者,换句话说,定义语言中有效句子的规则

      例如,以下英语句子包含语法错误(因为不定冠词“a”必须始终位于名词之前):

      这个句子包含语法错误a

    • 这与MySQL有什么关系

      每当一个人向计算机发出命令时,它必须做的第一件事就是“解析”该命令,以便理解它。“语法错误”意味着解析器无法理解所请求的内容,因为它不构成语言中的有效命令:换句话说,该命令违反了编程语言的语法

      需要注意的是,计算机必须先理解命令,然后才能对其执行任何操作。由于存在语法错误,MySQL不知道要查找什么,因此在查看数据库之前就放弃了,因此架构或表内容不相关

  2. 我怎么修理它

    显然,我们需要确定该命令是如何违反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$queryvar\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&gtSELECT*从`SELECT`中选择`SELECT`.id>100

    如果启用了ANSI_QUOTESSQL模式,也允许在双引号内引用标识符:

    mysql&gt创建表“测试”(col INT)
    错误1064:您的SQL语法有错误。。。
    mysql&gt设置sql_mode='ANSI_QUOTES'
    mysql&gt创建表“测试”(col INT)
    查询正常,0行受影响(0.00秒)

发表评论