Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/65.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么MySQL语法错误消息如此糟糕?_Mysql_Parsing_Syntax - Fatal编程技术网

为什么MySQL语法错误消息如此糟糕?

为什么MySQL语法错误消息如此糟糕?,mysql,parsing,syntax,Mysql,Parsing,Syntax,MySQL语法错误通常非常模糊,只指定错误发生的行。编写一个能够产生准确而有用的错误消息的解析器并不是一件轻而易举的事,但这不是一个公开的研究问题:大多数通用编程语言的编译器都会产生更有用的错误消息 那么为什么MySQL的解析器不能产生更好的错误消息呢?这是与MySQL有关,还是与SQL语法有关,使得这一点非常困难 下面是一个例子: SELECT * FROM foo WHERE bar > 0 AND baz NOT NULL ORDER BY qux ASC MySQL生成以下错误消

MySQL语法错误通常非常模糊,只指定错误发生的行。编写一个能够产生准确而有用的错误消息的解析器并不是一件轻而易举的事,但这不是一个公开的研究问题:大多数通用编程语言的编译器都会产生更有用的错误消息

那么为什么MySQL的解析器不能产生更好的错误消息呢?这是与MySQL有关,还是与SQL语法有关,使得这一点非常困难

下面是一个例子:

SELECT * FROM foo
WHERE bar > 0
AND baz NOT NULL
ORDER BY qux ASC
MySQL生成以下错误消息:
您的SQL语法有错误;请查看与您的MySQL服务器版本对应的手册,以了解使用接近'NULL ORDER BY qux ASC'的正确语法。


事实上,
notnull
应该是
notnull
。那么,为什么MySQL不在第3行第8列生成一个错误,如
意外令牌不存在?

MySQL优化器优化您发送的查询。当它被执行时,它看起来可能会完全不同。此外,认为列中的行在这段时间内保持不变的想法也是不正确的

下面介绍MySQL如何优化它得到的查询:

更新1:

以上是我关于错误报告为什么没有那么好的假设。我并不是说MySQL错误报告很好,它真的很糟糕。有时我会犯一些与实际错误完全无关的错误。以下是Peter Zaitsev遇到的一些问题(对于使用MySQL的人来说,这是一个很棒的博客):


Oracle是开源软件走向消亡的地方。他们有一个抑制因素,使免费提供的竞争对手,他们的商业数据库应用程序非常好。这已经足够好了,暂时没有人再做一个了,现在当我有选择的时候,我更喜欢MariaDB和其他的叉子。

我不是MySQL专家,但是一些括号会有帮助吗?其中((bar>0)和(baz不是NULL))ORDER BY qux ASCMySQL Workbench 5在此查询中突出显示
NULL
,并提供悬停消息
语法错误,意外的NULL\u-SYM,应为介于\u-SYM或in\u-SYM或类似项或REGEXP
。有趣,谢谢@AirThomas。在我的例子中,我从JDBC获取错误消息,但是命令行MySQL客户端产生了相同的错误;只有在编辑器窗口中才能得到更详细的版本。在我(承认有限)的经验中,MySQL的错误消息是我遇到过的最清晰的消息之一。100次中有99次错误出现在表格中引用的第一个单词处(或紧靠左边)。或者,如果没有显示任何单词,则几乎总是意味着带有括号的错误。然而,我确实认为,当引用的第一个单词是保留字时,MySQL应该能够让我们注意到这一事实。许多通用编程语言的编译器也执行复杂的优化和转换。解析和报告语法错误早在这之前就发生了。我不知道这与产生好的错误有什么关系。这并不意味着,在错误发生后,原始查询无法检索,然后由一个旨在提供更有用的错误消息的解析器进行第二次操作。我认为这是Sun做出的决定。我同意MySQL的错误报告非常糟糕。您应该可以看到我以前遇到的错误类型,至少您得到了短语
NULL
,这将您带到了某个地方。