Как я могу исправить ошибку MySQL #1064?

при выдаче команды MySQL я получаю ошибку #1064 "синтаксическая ошибка".

  1. Что это значит?

  2. Как я могу это исправить?

6 ответов


TL; DR

ошибка #1064 означает, что MySQL не может понять вашу команду. Чтобы исправить это:

  • прочитайте сообщение об ошибке. он говорит вам именно там, где в вашей команде MySQL запутался.

  • проверьте в руководстве пользователя. по сравнению с тем, что MySQL ожидается, что в этот момент, проблема часто очевидное.

  • Проверьте зарезервированные слова. если ошибка произошла с идентификатором объекта, проверьте, что это не зарезервированное слово (и, если это так, убедитесь, что оно правильно указано).

  1. проверил!! Что делает #1064 mean?

    ошибка посмотреть как gobbledygook, но они (часто) невероятно информативны и предоставляют достаточные детали, чтобы точно определить, что пошло не так. Понимая точно, что MySQL говорит вам, вы можете вооружиться, чтобы исправить любую проблему такого рода в будущем.

    как и во многих программах, ошибки MySQL кодируются в соответствии с тип проблемы, которая произошла. ошибка #1064 ошибка синтаксиса.

    • что это "синтаксис", о котором вы говорите? Это колдовство?

      в то время как "синтаксис" - это слово, которое многие программисты сталкиваются в контексте компьютеры, по сути, заимствованы из более широкой лингвистики. Это относится к структуре предложения, т. е. правила грамматики; или, другими словами, правила, определяющие, что составляет действующий приговор в рамках языка.

      например, следующее английское предложение содержит синтаксическую ошибку (поскольку неопределенная статья " a " всегда должна предшествовать существительному):

      это предложение содержит синтаксическую ошибку a.

    • какое это имеет отношение к MySQL?

      всякий раз, когда кто-то выдает команду компьютеру, одна из самых первых вещей, которые он должен сделать, это "разобрать" эту команду, чтобы понять ее. "Синтаксическая ошибка" означает, что синтаксический анализатор не может понять, что спрашивается, потому что он не представляет собой допустимую команду в языке: другими словами, команда нарушает грамматику программирования язык.

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

  2. как это исправить?

    очевидно, нужно определить, как это происходит, что команда нарушает грамматику MySQL. Это может показаться довольно непроницаемым, но MySQL очень старается помочь нам здесь. Все, что нам нужно сделать, это...--27-->

    • читать сообщения!

      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 версии 5.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 ]

    символ цитаты идентификатора-это backtick ("`"):

    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 с точкой с запятой, как процедура CREATE, то вам нужен плагин 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 = '{}';

различные причины.. скажем, например, если мы объявляем любую переменную, то она должна быть перед любым другим типом операторов. или нам нужно поставить блок BEGIN перед этим.

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 ; 

это может быть потому, что ваша строка или вставленные данные содержат одиночная кавычка ' вы можете попробовать

mysql_real_escape_string() for mysql or mysqli_real_escape_string() for mysqli

функция для выхода из строки при вставке данных (insert query) в базу данных.