Почему сообщения об ошибках синтаксиса MySQL настолько плохи?
=============================================================

 Синтаксические ошибки 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`? 

 

 MySQL Optimizer оптимизирует отправляемый вами запрос. К тому времени, когда это выполнено, это могло бы выглядеть довольно по-другому. Также идея о том, что линия столбец будет оставаться неизменной в течение этого времени, не является правильной. 

  Вот взгляд на то, как MySQL оптимизирует получаемые запросы: 

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

   **Обновление 1:**  

  Выше приведено мое предположение о том, почему отчеты об ошибках не так хороши. Я ни в коем случае не говорю, что отчеты об ошибках MySQL - это хорошо, это действительно плохо. Иногда я получаю ошибки, которые не имеют ничего общего с фактической ошибкой. Вот некоторые проблемы, с которыми столкнулся Питер Зайцев (отличный блог для людей, работающих с MySQL): 

   [http://www.mysqlperformanceblog.com/2011/04/06/more-on-mysql- сообщения об ошибках /](http://www.mysqlperformanceblog.com/2011/04/06/more-on-mysql-error-messages/)  <http://www.mysqlperformanceblog.com/2008/03/16/mysql-error-message-nonsenses/>