TL;DR
Błąd #1064 oznacza, że MySQL nie może zrozumieć twojego polecenia. Aby to naprawić:
-
Przeczytaj komunikat o błędzie. Informuje dokładnie, w którym miejscu polecenia MySQL się pomylił.
-
Zbadaj swoje polecenie. Jeśli używasz języka programowania do tworzenia polecenia, użyj
echo
,console.log()
lub jego odpowiednik, aby pokazać całe polecenie więc możesz to zobaczyć. -
Sprawdź instrukcję. Porównując z tym, czego MySQL oczekiwał w tym momencie , problem jest często oczywisty.
-
Sprawdź zarezerwowane słowa. Jeśli błąd wystąpił w identyfikatorze obiektu, sprawdź, czy nie jest to słowo zastrzeżone (a jeśli tak, upewnij się, że jest prawidłowo cytowane).
-
Aaaagh!! Co oznacza 1064 ?
Komunikaty o błędach mogą wyglądać jak gobbledygook, ale są one (często) niezwykle pouczające i zapewniają wystarczającą ilość szczegółów, aby wskazać, co poszło nie tak. Rozumiejąc dokładnie to, co mówi MySQL, możesz uzbroić się, aby rozwiązać każdy tego rodzaju problem w przyszłości.
Jak w wielu programach, błędy MySQL są kodowane zgodnie z typem problemu, który wystąpił. Błąd #1064 jest błędem składni.
-
Co to za „składnia”, o której mówisz? Czy to czary?
Chociaż „składnia” jest słowem, z którym wielu programistów spotyka się tylko w kontekście komputerów, w rzeczywistości jest ono zapożyczone z szerszej lingwistyki. Odnosi się do struktury zdania, czyli zasad gramatyki; czyli innymi słowy reguły określające, co stanowi prawidłowe zdanie w języku.
Na przykład następujące zdanie w języku angielskim zawiera błąd składni (ponieważ rodzajnik nieokreślony „a” musi zawsze poprzedzać rzeczownik):
To zdanie zawiera błąd składni a.
-
Co to ma wspólnego z MySQL?
Za każdym razem, gdy ktoś wydaje polecenie komputerowi, jedną z pierwszych rzeczy, które musi zrobić, jest „przeanalizowanie” tego polecenia, aby nadać mu sens. „Błąd składni” oznacza, że parser nie jest w stanie zrozumieć, o co jest pytane, ponieważ nie jest to prawidłowe polecenie w języku:innymi słowy, polecenie narusza gramatykę języka programowania .
Należy pamiętać, że komputer musi zrozumieć polecenie, zanim będzie mógł cokolwiek z nim zrobić. Ponieważ występuje błąd składni, MySQL nie ma pojęcia, czego szuka i dlatego rezygnuje zanim nawet spojrzy na bazę danych dlatego schemat lub zawartość tabeli nie są istotne.
-
-
Jak to naprawić?
Oczywiście należy ustalić, w jaki sposób polecenie narusza gramatykę MySQL. Może to zabrzmieć dość nieprzenikniona, ale MySQL naprawdę stara się nam tutaj 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 sugeruje jego naprawienie. Rozważmy na przykład 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 aż do słowa
WHERE
, ale wtedy pojawił się problem. Innymi słowy, nie spodziewał się napotkaćWHERE
w tym momencie.Wiadomości, które mówią
...near '' at line...
oznacza po prostu, że koniec polecenia został niespodziewanie napotkany:to znaczy, że coś innego powinno się pojawić przed zakończeniem polecenia. -
Zbadaj rzeczywisty tekst polecenia!
Programiści często tworzą polecenia SQL przy użyciu języka programowania. Na przykład program php może mieć (niewłaściwą) linię taką jak ta:
$result = $mysqli->query("UPDATE " . $tablename ."SET name='foo' WHERE id=101");
Jeśli napiszesz to w dwóch wierszach
$query = "UPDATE " . $tablename ."SET name='foo' WHERE id=101" $result = $mysqli->query($query);
następnie możesz dodać
echo $query;
lubvar_dump($query)
aby zobaczyć, że zapytanie faktycznie mówiUPDATE userSET name='foo' WHERE id=101
Często od razu zobaczysz swój błąd i będziesz w stanie go naprawić.
-
Przestrzegaj rozkazów!
MySQL zaleca również, abyśmy „sprawdzili instrukcję obsługi naszej wersji MySQL pod kątem właściwej składni ". Zróbmy to.
Używam MySQL v5.6, więc przejdę do ręczny wpis tej wersji dla
UPDATE
polecenie . Pierwszą rzeczą na stronie jest gramatyka polecenia (dotyczy to każdego polecenia):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ę zgodnie z konwencją typograficzną i składniową , ale dla naszych celów wystarczy rozpoznać, że:klauzule zawarte w nawiasach kwadratowych
[
i]
są opcjonalne; pionowe kreski|
wskazać alternatywy; i wielokropki...
oznaczają pominięcie ze względu na zwięzłość lub możliwość powtórzenia poprzedniego zdania.Wiemy już, że parser wierzył, że wszystko w naszym poleceniu było w porządku przed
WHERE
słowa kluczowego lub innymi słowy do odwołania do tabeli włącznie. Patrząc na gramatykę, widzimy, żetable_reference
musi następować poSET
słowo kluczowe:podczas gdy w naszym poleceniu następowało po nimWHERE
słowo kluczowe. To wyjaśnia, dlaczego parser zgłasza, że w tym momencie wystąpił problem.
Notatka o rezerwacji
Oczywiście był to prosty przykład. Jednak wykonując dwa opisane powyżej kroki (tj. obserwując dokładnie gdzie w poleceniu parser stwierdził, że gramatyka została naruszona i porównał z opisem w podręczniku czego oczekiwano w tym momencie ), praktycznie każdy błąd składni można łatwo zidentyfikować.
Mówię „prawie wszystkie”, ponieważ istnieje niewielka klasa problemów, które nie są tak łatwe do wykrycia — i właśnie w tym przypadku parser uważa, że napotkany element języka oznacza jedno, podczas gdy ty chcesz, by oznaczał coś innego. Weźmy następujący przykład:
UPDATE my_table SET where='foo'
Ponownie parser nie spodziewa się napotkać
WHERE
w tym momencie i tak zgłosi podobny błąd składni — ale nie zamierzałeś tegowhere
być słowem kluczowym SQL:chciałeś, aby identyfikował kolumnę do aktualizacji! Jednak zgodnie z dokumentacją w sekcji Nazwy obiektów schematu :Jeśli identyfikator zawiera znaki specjalne lub jest słowem zastrzeżonym, musisz cytuj go za każdym razem, gdy się do niego odwołujesz. (Wyjątek:słowo zastrzeżone, które występuje po kropce w nazwie kwalifikowanej, musi być identyfikatorem, więc nie musi być cytowane). Zarezerwowane słowa są wymienione pod adresem Sekcja 9.3, „Słowa kluczowe i słowa zastrzeżone” .
[ deletia ]
Znak cudzysłowu identyfikatora to znak zaznaczenia („
`
”):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)
-