Jak mogę naprawić błąd MySQL #1064?

Podczas wydawania polecenia do MySQL, dostaję błąd #1064 "błąd składni".

  1. Co to znaczy?

  2. Jak mogę to naprawić?

Author: eggyal, 2014-05-07

6 answers

TL;DR

Błąd #1064 oznacza, że MySQL nie rozumie Twojego polecenia. Aby to naprawić:

  • Przeczytaj komunikat o błędzie. mówi ci gdzie dokładnie w Twoim poleceniu MySQL się pomylił.

  • Sprawdź instrukcję. porównując z tym, czego oczekiwał MySQL w tym momencie , problem jest często oczywisty.

  • Sprawdź słowa kluczowe. jeśli błąd wystąpił na identyfikator obiektu, sprawdź, czy nie jest to słowo zarezerwowane (a jeśli tak, upewnij się, że jest prawidłowo cytowane).

  1. Aaaagh!! Co # 1064 oznacza?

    Komunikaty o błędach mogą wyglądać jak gobbledygook, ale są (często) niezwykle pouczające i dostarczają wystarczających informacji, aby określić, co poszło nie tak. Rozumiejąc dokładnie to, co mówi ci MySQL, możesz uzbroić się w rozwiązanie każdego problemu tego typu w przyszłość.

    Jak w wielu programach, błędy MySQL są kodowane zgodnie z typem problemu, który wystąpił. Jest to błąd składni.

    • Co to za "składnia", o której mówisz? Czy to czary?

      Podczas gdy "składnia" jest słowem, które wielu programistów spotyka tylko w kontekście komputerów, w rzeczywistości jest zapożyczone z szerszego językoznawstwa. Odnosi się do struktury zdań: tj. reguł gramatyki ; lub, w innych słowa, reguły określające, co stanowi Ważne zdanie w obrębie języka.

      Na przykład następujące zdanie angielskie zawiera błąd składni (ponieważ przedimek nieokreślony " a " musi zawsze poprzedzać rzeczownik):

      To zdanie zawiera błąd składni a.

    • Co to ma wspólnego z MySQL?

      Gdy ktoś wydaje komendę komputerowi, jedną z pierwszych rzeczy, które musi zrobić, jest "parse", które dowództwo, aby nadać mu sens. "Błąd składni" oznacza, że parser nie jest w stanie zrozumieć, co jest pytane, ponieważ nie stanowi poprawnego polecenia w języku: innymi słowy, polecenie narusza gramatykę języka programowania.

      Ważne jest, aby pamiętać, że komputer musi zrozumieć polecenie, zanim będzie mógł cokolwiek z nim zrobić. Ponieważ jest błąd składni, MySQL nie ma pojęcia o co chodzi i dlatego rezygnuje zanim nawet spojrzy na bazę danych i dlatego schemat lub zawartość tabeli nie są istotne.

  2. Jak to naprawić?

    Oczywiście, trzeba ustalić, jak to jest, że polecenie narusza gramatykę MySQL. Może to zabrzmieć dość nieprzenikalnie, ale MySQL bardzo stara się nam w tym pomóc. Wszystko, co musimy zrobić, to ...

    • Przeczytaj wiadomość!

      MySQL nie tylko mówi nam dokładnie gdzie parser napotkał błąd składni, ale także zasugerował jego naprawienie. Na przykład rozważ następujące polecenie SQL:

      UPDATE my_table WHERE id=101 SET name='foo'
      

      To polecenie wyświetla następujący komunikat o błędzie:

      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 mówi nam, że wszystko wydawało się w porządku do słowa WHERE, ale potem napotkano problem. Innymi słowy, nie spodziewał się spotkania WHERE w tym momencie.

      Wiadomości, które mówią ...near '' at line... po prostu oznaczają, że koniec polecenia był napotkane nieoczekiwanie: oznacza to, że przed zakończeniem polecenia powinno pojawić się coś innego.

    • Wykonuj rozkazy!

      MySQL zaleca również, abyśmy "sprawdzili instrukcję odpowiadającą naszej wersji MySQL pod kątem właściwej składni". Zróbmy to.

      Używam MySQL v5. 6, więc przejdę do ręcznego wpisania tej wersji dla UPDATE polecenia. Pierwszą rzeczą na stronie jest gramatyka polecenia (dotyczy to każdego polecenie):

      UPDATE [LOW_PRIORITY] [IGNORE] table_reference
          SET col_name1={expr1|DEFAULT} [, col_name2={expr2|DEFAULT}] ...
          [WHERE where_condition]
          [ORDER BY ...]
          [LIMIT row_count]
      

      Podręcznik wyjaśnia, jak interpretować tę składnię w konwencjach typograficznych i składniowych, ale dla naszych celów wystarczy uznać, że: klauzule zawarte w nawiasach kwadratowych [ i ] są opcjonalne; pionowe słupki | wskazują alternatywy; i elipsy ... oznaczają albo pominięcie zwięzłości, albo że poprzednia klauzula może być powtórzona.

      Wiemy już, że parser wierzył, że wszystko w naszej komendzie jest w porządku przed słowem kluczowym WHERE lub innymi słowy do odwołania do tabeli włącznie. Patrząc na gramatykę, widzimy, że table_reference musi być poprzedzone słowem kluczowym SET: podczas gdy w naszym poleceniu było faktycznie poprzedzone słowem kluczowym WHERE. To wyjaśnia, dlaczego parser zgłasza, że problem został napotkany w tym momencie.

    Notatka o rezerwacji

    Oczywiście, był to prosty przykład. Jednak postępując zgodnie z dwoma krokami przedstawionymi powyżej (tj. obserwując dokładnie gdzie w poleceniu parser znalazł pogwałcenie gramatyki i porównując z opisem podręcznika to, czego oczekiwano w tym momencie ), praktycznie każdy błąd składni może być łatwo zidentyfikowany.

    Mówię "praktycznie wszystkie" , ponieważ istnieje mała klasa problemów, które nie są tak łatwe do wykrycia-i to jest miejsce, w którym parser wierzy, że napotkany element języka oznacza jedną rzecz, podczas gdy ty zamierzasz to oznaczać kolejny. Weźmy następujący przykład:

    UPDATE my_table SET where='foo'
    

    Ponownie, parser nie spodziewa się napotkać WHERE w tym momencie, a więc spowoduje podobny błąd składni-ale nie zamierzałeś where być słowem kluczowym SQL: miałeś zamiar zidentyfikować kolumnę do aktualizacji! Jednak, jak udokumentowano pod Schema Object Names :

    Jeśli identyfikator zawiera znaki specjalne lub jest słowem zastrzeżonym, musisz zacytować go za każdym razem, gdy się do niego odwołujesz. (Wyjątek: słowo zarezerwowane, które następuje po kropce w nazwie kwalifikowanej, musi być identyfikatorem, więc nie musi być cytowane.)Słowa zastrzeżone są wymienione w sekcja 9.3, "słowa kluczowe i słowa zastrzeżone".

    [ deletia ]

    Znakiem cytowania identyfikatora jest backtick ("`"):

    mysql> SELECT * FROM `select` WHERE `select`.id > 100;

    Jeśli ANSI_QUOTES tryb SQL jest włączony, dopuszczalne jest również cytowanie identyfikatorów w podwójnych cudzysłowach:

    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)
 98
Author: eggyal,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-07-14 12:12:15

Jeśli pojawi się błąd klienta SQuirreL przy uruchomieniu SQL rxpression ze średnikiem jak procedura CREATE, to potrzebujesz wtyczki MySQL. Możesz go wybrać podczas instalacji. Nie jest domyślnie zaznaczona.

 0
Author: Horcrux7,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-10-26 09:08:37

W moim przypadku próbowałem wykonać kod procedury w MySQL i z powodu jakiegoś problemu z serwerem, w którym serwer nie może dowiedzieć się, gdzie zakończyć instrukcję, otrzymałem kod błędu 1064. Więc owinąłem procedurę niestandardowym ogranicznikiem i działało dobrze.

Na przykład, zanim było:

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;

Po umieszczeniu DELIMITERA było tak:

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 ;
 0
Author: Umair Malhi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-04-19 10:54:27

Pojawia się również ten błąd, gdy próbujesz wstawić JSON lub inne dane ze znakami specjalnymi, bez potrzebnych cudzysłowów, np:

UPDATE myTable SET myJSONfield = {};

Zmień na

UPDATE myTable SET myJSONfield = '{}';
 0
Author: Andrew,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-01 20:17:25

Różne powody.. powiedzmy dla np. jeśli zadeklarujemy jakąkolwiek zmienną, to powinna być przed jakimkolwiek innym typem instrukcji. albo musimy wcześniej ustawić blok startowy.

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; 

Daje błąd więc musimy go zrobić

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 ; 
 0
Author: user5493732,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-08-08 09:31:40

Być może dlatego, że Twój ciąg lub wstawione dane zawierają pojedynczy cudzysłów ' Możesz spróbować

mysql_real_escape_string() for mysql or mysqli_real_escape_string() for mysqli

Funkcja do ucieczki ciągu podczas wstawiania danych (insert query) do bazy danych.

 0
Author: Hussnain sheikh,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-03-09 17:58:49