Подтвердить что ты не робот

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

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

  • Что это значит?

  • Как я могу его исправить?

4b9b3361

Ответ 1

TL; DR

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

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

  • Изучите свою команду. Если вы используете язык программирования для создания своей команды, используйте echo, console.log() или его эквивалент, чтобы показать всю команду, чтобы вы могли ее увидеть.

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

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

  1. Aaaagh !! Что означает # 1064?

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

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

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

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

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

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

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

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

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

  2. Как мне это исправить?

    Очевидно, что нужно определить, почему команда нарушает грамматику 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... просто означают, что конец команды был обнаружен неожиданно: то есть что-то еще должно появиться до окончания команды.

    • Изучите фактический текст вашей команды!

      Программисты часто создают команды SQL, используя язык программирования. Например, программа php может иметь (неправильную) строку, подобную этой:

      $result = $mysqli->query("UPDATE " . $tablename ."SET name='foo' WHERE id=101");
      

      Если вы напишите это в две строки

      $query = "UPDATE " . $tablename ."SET name='foo' WHERE id=101"
      $result = $mysqli->query($query);
      

      тогда вы можете добавить echo $query; или var_dump($query) чтобы увидеть, что запрос на самом деле говорит

      UPDATE userSET name='foo' WHERE id=101
      

      Часто вы сразу увидите свою ошибку и сможете ее исправить.

    • Выполняй приказы!

      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 ANSI_QUOTES, допустимо также заключать идентификаторы в двойные кавычки:

    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)

Ответ 2

Если вы получили сообщение об ошибке с SQuirreL Client при выполнении SQL-запроса с точкой с запятой, например CREATE PROCEDURE, вам нужен плагин MySQL. Вы можете выбрать его при установке. По умолчанию он не выбран.

Ответ 3

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

Например, перед тем как это было:

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;

После помещения DELIMITER это было так:

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 ;

Ответ 4

Вы также получаете эту ошибку, когда пытаетесь вставить JSON или другие данные со специальными символами, без необходимых кавычек, например:

UPDATE myTable SET myJSONfield = {};

Измените вышеуказанное на:

UPDATE myTable SET myJSONfield = '{}';

Ответ 5

Различные причины для этого.. скажем, например. если мы объявляем любую переменную, то она должна быть перед любыми другими типами операторов. иначе нам нужно поставить блок 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 ;