如何修复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发出命令时,我得到了错误#1064“语法错误”

  • 这是什么意思

  • 我怎样才能修好它

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

    • 阅读错误消息。它准确地告诉您MySQL在您的命令中被混淆的地方

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

    • 查看手册。与MySQL当时的预期相比,问题往往是显而易见的

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

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

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

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

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

      这个句子包含语法错误a

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

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

  • 我怎么修理它? 显然,我们需要确定该命令是如何违反MySQL语法的。这听起来可能很难理解,但MySQL正在努力帮助我们。我们需要做的就是

    • 读留言! MySQL不仅告诉我们解析器遇到语法错误的确切位置,而且还提出了修复它的建议。例如,考虑下面的SQL命令:

      更新my_表,其中id=101 SET name='foo'
      
      该命令产生以下错误消息:

      错误1064(42000):您的SQL语法有错误;检查与您的MySQL服务器版本对应的手册,以了解第1行“WHERE id=101 SET name='foo''附近要使用的正确语法

      MySQL告诉我们,在单词
      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
      关键字:而在我们的命令中,它后面实际上跟有
      WHERE
      关键字。这就解释了为什么解析器是r
      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 ;