Синтаксические ошибки 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/2008/03/16/mysql-error-message-nonsenses/
/b
и где мы дадим каталог? – smttsp 04.10.2019, 11:34NULL
, который привел Вас куда-нибудь. – Aziz Saleh 18.05.2020, 04:03