当前位置: 首页 > 面试题库 >

如何修复MySQL错误#1064?

陆光济
2023-03-14
问题内容

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

  1. 这是什么意思?

  2. 我该如何解决?


问题答案:

错误#1064表示MySQL无法理解您的命令。要解决这个问题:

  • 阅读错误消息。准确地 告诉您MySQL 在命令中哪里 混淆了。

  • 检查您的命令。 如果您使用的编程语言来创建你的命令,使用echoconsole.log()或同等学历,以显示 完整的命令
    ,所以你可以看到它。

  • 检查手册。 通过对MySQL的什么比较 期待在这一点上 ,问题往往是显而易见的。

  • 检查保留字。 如果错误发生在对象标识符上,请检查它是否不是保留字(如果是,请确保正确引用了该字)。

  1. 啊!#1064 什么 意思

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

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

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

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

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

这句话包含语法错误a。

* ## 这与MySQL有什么关系?

每当向计算机发出命令时,它首先要做的一件事情就是“解析”该命令以使其有意义。“语法错误”意味着解析器无法理解所要询问的内容,因为它在语言中未构成有效的命令:换句话说,
该命令违反了编程语言的语法

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

  1. 我如何解决它?

显然,需要确定该命令违反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,因此我将转向该版本的手册中的UPDATEcommand。页面上的第一件事是命令的语法(对于每个命令都是如此):

            UPDATE [LOW_PRIORITY] [IGNORE] **_table_reference_**
        SET **_col_name1_** ={ ** _expr1_** |DEFAULT} [, **_col_name2_** ={ ** _expr2_** |DEFAULT}] ...
        [WHERE **_where_condition_** ]
        [ORDER BY ...]
        [LIMIT **_row_count_** ]

该手册介绍如何解释下这句法排版和语法约定,但对我们而言这足以认识到:条款包含在方括号中[]是可选的;
竖线|表示替代方案;和省略号...表示为简洁起见,或者可以重复前面的条款。

我们已经知道,解析器认为我们命令中的所有内容都可以在WHERE关键字之前使用,或者换句话说,直到并包括表引用。查看语法,我们看到
table_reference

必须在其后跟SET关键字:而在我们的命令中,实际上是WHERE关键字。这解释了为什么解析器报告此时遇到了问题。

预订单

当然,这是一个简单的例子。但是,通过遵循上面概述的两个步骤(即, 准确 观察语法分析在命令中哪个位置,然后 将语法与手册中
对当时期望 的描述进行比较),几乎可以很容易地识别出每个语法错误。

我说“几乎全部”,是因为有一小类问题并不十分容易发现,而且解析器认为遇到的语言元素意味着一件事,而您打算将其理解为另一件事。请看以下示例:

    UPDATE my_table SET where='foo'

再次,解析器预计不会WHERE在这一点上遇到,因此会引发类似的语法错误-
但您并不想将其用作whereSQL关键字:您曾打算让它识别要更新的列!但是,如Schema Object
Names所述:

如果标识符包含特殊字符或为保留字,则在引用标识符时 必须将其
引用。(例外:限定名称中句点后的保留字必须是标识符,因此无需引用。)保留字在第9.3节“关键字和保留字”中列出。

>     [ **_删除_** ]

标识符引号是反引号(“ ```”):

>     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)


 类似资料:
  • ProjectAAA.obj:错误LNK2001:未解析的外部符号" public:_ this call X::class event::class event(unsigned int)"(??0类事件@X@@QAE@I@Z) 我已经定义了不知道如何修复这个LINK错误。 欢迎提出任何建议。 谢谢你 更多信息: 1. 现在我已经完全隔离了错误: 1.

  • 我正在设置一个PHP服务器,因为我编写了一些PHP代码:我打开XAMPP时,它说: 18:36:08[Apache]错误:Apache意外关闭。 18:36:08[Apache]这可能是由于端口阻塞、缺少依赖项、权限不当、崩溃或其他方法关闭。 18:36:08[Apache]如果您需要更多帮助,请复制并在论坛上发布整个日志窗口 18:36:23检测到[mysql]状态更改:已停止 18:36:23

  • 我发现了一个mysql创建表语法错误,希望有人能在我失去理智之前发现它。 错误1064(42000):您的SQL语法中有错误;查看与您的MySQL server版本相对应的手册,以了解在第2行“int not null auto_increment,Client_ID int not null,Start_Time varchar(5),star”附近使用的正确语法 mysql Ver 14.14

  • 尝试了许多解决办法,但都无济于事 参考:在当前主题中找不到样式“协调器LayoutStyle” 但没有帮助 底部App Bar材质设计 应用程序条:底部材质设计

  • 我正在编程一个需要Hibernate技术的项目。我得到了堆栈痕迹,但我不知道如何修复它。有什么需要帮忙的吗? 这是我的堆栈跟踪,我得到了这两个错误: SLF4J:slf4j-api 1.6.x(或更高版本)与此绑定不兼容。SLF4J:您的绑定是1.5.5或更早版本。SLF4J:将绑定升级到1.6.x版本。或2.0.x 导入org.hibernate.hibernateException;导入org