Как я могу исправить ошибку MySQL #1064?
при выдаче команды MySQL, я получаю ошибку #1064 "синтаксическая ошибка".
Что это значит?
Как я могу это исправить?
6 ответов:
TL; DR
ошибка #1064 означает, что MySQL не может понять вашу команду. Чтобы исправить это:
прочитайте сообщение об ошибке. он говорит вам именно там, где в вашей команде MySQL запутался.
проверьте в руководстве пользователя. сравнивая с тем, что MySQL ожидается, что в этот момент, проблема часто очевидное.
Проверьте зарезервированные слова. если ошибка произошла с идентификатором объекта, проверьте, что это не зарезервированное слово (и, если это так, убедитесь, что оно правильно указано).
проверил!! Что делает #1064 значит?
ошибка посмотреть как gobbledygook, но они (часто) невероятно информативны и обеспечивают достаточную детализацию, чтобы точно определить, что пошло не так. Понимая точно, что MySQL говорит вам, вы можете вооружиться, чтобы исправить любую проблему такого рода в будущем.
как и во многих программах, ошибки MySQL кодируются в соответствии с тип проблемы, которая произошла. ошибка #1064 ошибка синтаксиса.
что это "синтаксис", о котором вы говорите? Это колдовство?
в то время как "синтаксис" - это слово, которое многие программисты сталкиваются в контексте компьютеры, это на самом деле заимствовано из более широкой лингвистики. Это относится к структуре предложения, т. е. правила грамматики; или, другими словами, правила, которые определяют, что является действующий приговор в рамках языка.
например, следующее английское предложение содержит синтаксическую ошибку (потому что неопределенная статья " a " всегда должна предшествовать существительному):
это предложение содержит синтаксическую ошибку а.
какое это имеет отношение к MySQL?
всякий раз, когда кто-то выдает команду компьютеру, одна из самых первых вещей, которые он должен сделать, - это "разобрать" эту команду, чтобы понять ее. "Синтаксическая ошибка" означает, что синтаксический анализатор не может понять, что запрашивается, потому что это не является допустимой командой в языке: другими словами, команда нарушает грамматику программирования язык.
важно отметить, что компьютер должен понимать команду, прежде чем он сможет что-либо с ней сделать. Поскольку есть синтаксическая ошибка, MySQL понятия не имеет, что такое после и поэтому сдается прежде чем он даже смотрит на базу данных и поэтому схема или содержимое таблицы не имеют отношения.
как это исправить?
очевидно, нужно определить, как это происходит, что команда нарушает грамматику MySQL. Это может показаться довольно непроницаемым, но MySQL очень старается помочь нам здесь. Все, что нам нужно сделать, это...
читать сообщения!
MySQL не только говорит нам ровно где синтаксический анализатор обнаружил ошибку синтаксиса, но также делает предложение для ее исправление. Например, рассмотрим следующую команду SQL:
UPDATE my_table WHERE id=101 SET name='foo'
эта команда выдает следующую ошибку сообщение:
ERROR 1064 (42000): 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 'WHERE id=101 SET name='foo'' at line 1
MySQL говорит нам, что все казалось прекрасным до слова
WHERE
, но затем возникла проблема. Другими словами, он не ожидал встретитьWHERE
в этой точке.сообщения, которые говорят
...near '' at line...
просто означает, что конец команды был обнаружен неожиданно: то есть, что-то еще должно появиться до окончания команды.подчиняться приказы!
MySQL также рекомендует нам "проверьте руководство, которое соответствует нашей версии MySQL для правильного синтаксиса, чтобы использовать". Давай так и сделаем.
я использую MySQL v5. 6, поэтому я перейду к ручная запись этой версии для
UPDATE
команда. Самое первое на странице-это грамматика команды (это верно для каждой команды):UPDATE [LOW_PRIORITY] [IGNORE] table_reference SET col_name1={expr1|DEFAULT} [, col_name2={expr2|DEFAULT}] ... [WHERE where_condition] [ORDER BY ...] [LIMIT row_count]
в руководстве объясняется, как интерпретировать этот синтаксис в разделе типографские и синтаксические соглашения, но для наших целей достаточно признать, что: предложения, содержащиеся в квадратных скобках
[
и]
являются необязательными; вертикальные полосы|
укажите альтернативы; и Многоточия...
обозначьте либо упущение для краткости, либо то, что предыдущее предложение может быть повторено.мы уже знаем, что парсер верил, что все в нашей команде было хорошо до
WHERE
ключевое слово, или другими словами До и включая ссылку на таблицу. Глядя на грамматику, мы видим, чтоtable_reference
должен следоватьSET
ключевое слово: в то время как в нашей команде он фактически следовал заWHERE
ключевое слово. Это объясняет, почему анализатор сообщает, что в этот момент возникла проблема.примечание о бронировании
конечно, это был простой пример. Однако, следуя двум шагам, описанным выше (т. е. наблюдая именно там, где в команде синтаксический анализатор обнаружил, что грамматика была нарушена и сравнивается с описанием руководства как ожидается, в этот момент), практически каждая синтаксическая ошибка может быть легко идентифицирована.
я говорю "практически все", потому что есть небольшой класс проблем, которые не так легко обнаружить-и именно там парсер считает, что элемент языка, с которым столкнулся, означает одно, тогда как вы намереваетесь его означать другое. Возьмем следующий пример:
UPDATE my_table SET where='foo'
опять же, парсер не ожидает столкнуться
WHERE
в этот момент и так возникнет аналогичная синтаксическая ошибка-но вы не предназначались для этогоwhere
чтобы быть ключевым словом SQL: вы предназначались для него, чтобы определить столбец для обновления! Однако, как описано в разделе Имена Объектов Схемы:если идентификатор содержит специальные символы или является зарезервированным словом, вы должны цитировать всякий раз, когда вы ссылаетесь на него. (Исключение: зарезервированное слово, которое следует за точкой в полном имени, должно быть идентификатором, поэтому его не нужно заключать в кавычки.) Зарезервированные слова перечислены в раздел 9.3, "ключевые слова и зарезервированные слова".
[ deletia ]символ кавычки идентификатора является обратным знаком ("
`
"):mysql> SELECT * FROM `select` WHERE `select`.id > 100;
если
ANSI_QUOTES
включен режим SQL, также допускается указывать идентификаторы в двойных кавычках метки:mysql> CREATE TABLE "test" (col INT); ERROR 1064: You have an error in your SQL syntax... mysql> SET sql_mode='ANSI_QUOTES'; mysql> CREATE TABLE "test" (col INT); Query OK, 0 rows affected (0.00 sec)
Если вы получаете сообщение об ошибке с клиентом SQuirreL при запуске SQL rxpression с точкой с запятой, как создать процедуру, то вам нужен плагин MySQL. Вы можете выбрать его при установке. По умолчанию он не выбран.
в моем случае я пытался выполнить код процедуры в MySQL, и из-за некоторой проблемы с сервером, в котором сервер не может понять, где закончить оператор, я получал код ошибки 1064. Поэтому я завернул процедуру с помощью пользовательского разделителя, и она работала нормально.
например, раньше было:
DROP PROCEDURE IF EXISTS getStats; CREATE PROCEDURE `getStats` (param_id INT, param_offset INT, param_startDate datetime, param_endDate datetime) BEGIN /*Procedure Code Here*/ END;
после установки разделителя это было так:
DROP PROCEDURE IF EXISTS getStats; DELIMITER $$ CREATE PROCEDURE `getStats` (param_id INT, param_offset INT, param_startDate datetime, param_endDate datetime) BEGIN /*Procedure Code Here*/ END; $$ DELIMITER ;
вы также получаете эту ошибку при попытке вставить JSON или другие данные со специальными символами, без необходимых кавычек, например:
UPDATE myTable SET myJSONfield = {};
изменить на
UPDATE myTable SET myJSONfield = '{}';
различные причины.. скажем, например, если мы объявляем любую переменную, то она должна быть перед любым другим типом операторов. или же нам нужно поставить начальный блок перед этим.
DECLARE _RoomID INTEGER ; SET _dtTodayTmp=NOW(); SET _dtToday=DATE_FORMAT(_dtTodayTmp,"%m/%d/%y"); SET _tmNow=DATE_FORMAT(_dtTodayTmp,"%h:%i:%s"); DECLARE tree_cursor1 CURSOR FOR SELECT roomid FROM reservationDet rd WHERE rd.status=3 AND rd.compcode=pCompCode;
дает ошибку, поэтому нам нужно сделать это
DECLARE _RoomID INTEGER ; SET _dtTodayTmp=NOW(); SET _dtToday=DATE_FORMAT(_dtTodayTmp,"%m/%d/%y"); SET _tmNow=DATE_FORMAT(_dtTodayTmp,"%h:%i:%s"); **BEGIN** DECLARE tree_cursor1 CURSOR FOR SELECT roomid FROM reservationDet WHERE STATUS = 3 AND compcode = pCompCode ;