egg*_*yal 61 mysql syntax parsing syntax-error mysql-error-1064
向MySQL发出命令时,我收到错误#1064"语法错误".
这是什么意思?
我该如何解决?
egg*_*yal 114
TL; DR
错误#1064意味着MySQL无法理解您的命令.要解决这个问题:
阅读错误消息. 它告诉你MySQL 命令的确切位置.
检查你的命令.如果您使用的编程语言来创建你的命令,使用
echo,console.log()或同等学历,以显示完整的命令,所以你可以看到它.检查手册.通过与MySQL 在此时的预期进行比较,问题通常是显而易见的.
检查保留字.如果对象标识符发生错误,请检查它是否为保留字(如果是,请确保它已正确引用).
错误消息可能看起来像gobbledygook,但它们(通常)提供了令人难以置信的信息,并提供足够的细节来查明出错的地方.通过准确理解MySQL告诉你的内容,你可以在未来武装自己解决这类问题.
与许多程序一样,MySQL错误根据发生的问题类型进行编码. 错误#1064是语法错误.
虽然"语法"是许多程序员只在计算机环境中遇到的一个词,但它实际上是从更广泛的语言学中借用的.它指的是句子结构:即语法规则 ; 或者换句话说,定义什么构成语言中的有效句子的规则.
例如,以下英语句子包含语法错误(因为不定冠词"a"必须始终位于名词之前):
这句话包含语法错误a.
每当向计算机发出命令时,它必须做的第一件事就是"解析"该命令以便理解它."语法错误"意味着解析器无法理解所请求的内容,因为它不构成语言中的有效命令:换句话说,该命令违反了编程语言的语法.
重要的是要注意,计算机必须先了解该命令才能对其执行任何操作.因为存在语法错误,所以MySQL不知道后者是什么,因此在它甚至查看数据库之前放弃,因此架构或表内容不相关.
显然,需要确定命令违反MySQL语法的方式.这可能听起来非常难以理解,但MySQL正在努力帮助我们.我们需要做的就是......
MySQL不仅告诉我们解析器遇到语法错误的确切位置,还提出修复它的建议.例如,请考虑以下SQL命令:
UPDATE my_table WHERE id=101 SET name='foo'
Run Code Online (Sandbox Code Playgroud)
该命令产生以下错误消息:
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");
Run Code Online (Sandbox Code Playgroud)
如果你用两行写这个
$query = "UPDATE " . $tablename ."SET name='foo' WHERE id=101"
$result = $mysqli->query($query);
Run Code Online (Sandbox Code Playgroud)
然后你可以添加echo $query;或var_dump($query)查看查询实际上说的内容
UPDATE userSET name='foo' WHERE id=101
Run Code Online (Sandbox Code Playgroud)
通常,您会立即看到错误并能够修复它.
MySQL还建议我们" 检查与我们的MySQL版本相对应的手册,以便使用正确的语法 ".我们这样做.
我正在使用MySQL v5.6,所以我将转向该版本的手动输入UPDATE命令.页面上的第一件事是命令的语法(对于每个命令都是如此):
UPDATE [LOW_PRIORITY] [IGNORE] table_reference
SET col_name1={expr1|DEFAULT} [, col_name2={expr2|DEFAULT}] ...
[WHERE where_condition]
[ORDER BY ...]
[LIMIT row_count]
Run Code Online (Sandbox Code Playgroud)
该手册介绍如何解释下这句法排版和语法约定,但对我们而言这足以认识到:包含在方括号中的条款[和]可选; 竖条|表示替代品; 椭圆...表示省略,或者可以重复前面的条款.
我们已经知道解析器认为我们命令中的所有内容在WHERE关键字之前都是正常的,或者换句话说直到并包括表引用.查看语法,我们看到table_reference必须后跟SET关键字:而在我们的命令中,实际上后面跟着WHERE关键字.这解释了解析器报告此时遇到问题的原因.
当然,这是一个简单的例子.但是,通过遵循上面概述的两个步骤(即,在命令中确切地观察解析器发现语法被违反的位置并且与手册对该点的预期描述进行比较),几乎可以容易地识别每个语法错误.
我说"几乎所有",因为有一小部分问题不太容易被发现 - 而且解析器认为遇到的语言元素意味着一件事,而你打算意味着另一件事.请看以下示例:
UPDATE my_table SET where='foo'
Run Code Online (Sandbox Code Playgroud)
同样,解析器WHERE在此时不会遇到,因此会引发类似的语法错误 - 但您并不打算where将其作为SQL关键字:您原本打算用它来标识要更新的列!但是,如架构对象名称中所述:
如果标识符包含特殊字符或是保留字,则必须在引用时引用它.(例外:在限定名称中的句点之后的保留字必须是标识符,因此不需要引用.)保留字在第9.3节"关键字和保留字"中列出.
[ deletia ]标识符引号字符是反引号("
`"):Run Code Online (Sandbox Code Playgroud)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)
| 归档时间: |
|
| 查看次数: |
299574 次 |
| 最近记录: |