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
的错误?
答案 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和其他分支,当我给出一个选择时。