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

时间:2014-03-28 15:40:40

标签: mysql parsing syntax

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

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

以下是一个例子:

SELECT * FROM foo
WHERE bar > 0
AND baz NOT NULL
ORDER BY qux ASC

MySQL生成以下错误消息: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 'NULL ORDER BY qux ASC'

事实上,NOT NULL应为IS NOT NULL。那么为什么MySQL不会产生类似Unexpected token NOT at line 3 column 8的错误?

2 个答案:

答案 0 :(得分:2)

MySQL Optimizer优化您发送的查询。当它被执行时,它可能看起来非常不同。此外,列在一段时间内保持不变的想法是不正确的。

以下是MySQL如何优化它获得的查询:

http://dev.mysql.com/doc/internals/en/optimizer-primary-optimizations.html

更新1:

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

http://www.mysqlperformanceblog.com/2011/04/06/more-on-mysql-error-messages/ http://www.mysqlperformanceblog.com/2008/03/16/mysql-error-message-nonsenses/

答案 1 :(得分:1)

Oracle是开源软件夭折的地方。他们不愿意让免费提供的商业数据库应用程序的竞争对手非常好。有一段时间没有人会再制作另一个,现在我更喜欢MariaDB和其他分支,当我给出一个选择时。