gpt4 book ai didi

mysql - 如何修复MySQL错误#1064?

转载 作者:行者123 更新时间:2023-11-30 22:35:14 27 4
gpt4 key购买 nike

向MySQL发出命令时,出现错误#1064“语法错误”。


这是什么意思?
我该如何解决?

最佳答案

TL; DR
  
  错误#1064表示MySQL无法理解您的命令。要解决这个问题:
  
  
  阅读错误消息。它准确地告诉您MySQL在命令中哪里混淆了。
  检查您的命令。如果使用编程语言创建命令,请使用echoconsole.log()或等效语言来显示整个命令,以便可以看到它。
  检查手册。通过与当时MySQL的预期进行比较,该问题通常很明显。
  检查保留字。如果错误发生在对象标识符上,请检查它是否不是保留字(如果是,请确保正确引用了该字)。
  



啊! #1064是什么意思?

错误消息可能看起来像傻瓜,但它们(通常)提供了令人难以置信的信息,并且提供了足够的详细信息来找出问题所在。通过确切地了解MySQL会告诉您什么,您可以武装自己解决将来的任何此类问题。

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


您所说的“语法”是什么?是巫术吗?

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

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


  这句话包含语法错误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

显示 ...near '' at line...的消息仅表示意外遇到了命令结尾:也就是说,在命令结束之前应该出现其他内容。
检查命令的实际文本!

程序员通常使用编程语言创建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,因此会引发类似的语法错误-但是您并没有打算将 where用作SQL关键字:您曾打算让它识别列更新!但是,如 Schema Object Names中所述:


  如果标识符包含特殊字符或为保留字,则在引用标识符时必须将其引用。 (例外:限定名称中句点后的保留字必须是标识符,因此不必加引号。)保留字在 Section 9.3, “Keywords and Reserved Words”处列出。

[ deletia ]

The identifier quote character is the backtick (“`”):

mysql> SELECT * FROM `select` WHERE `select`.id > 100;

  
  如果启用了 ANSI_QUOTES SQL模式,也可以在双引号中引起标识符的引用:
  
  
mysql> CREATE TABLE "test" (col INT);
ERROR 1064: You have an error in your SQL syntax...
mysql> SET sql_mode='ANSI_QUOTES';
mysql> CREATE TABLE "test" (col INT);
Query OK, 0 rows affected (0.00 sec)

关于mysql - 如何修复MySQL错误#1064?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32746069/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com