TL;DR
Fejl #1064 betyder, at MySQL ikke kan forstå din kommando. Sådan rettes det:
-
Læs fejlmeddelelsen. Den fortæller dig nøjagtig hvor i din kommando MySQL blev forvirret.
-
Undersøg din kommando. Hvis du bruger et programmeringssprog til at oprette din kommando, skal du bruge
echo
,console.log()
, eller tilsvarende for at vise hele kommandoen så du kan se det. -
Tjek vejledningen. Ved at sammenligne med, hvad MySQL forventede på det tidspunkt , problemet er ofte indlysende.
-
Se efter reserverede ord. Hvis fejlen opstod på et objekt-id, skal du kontrollere, at det ikke er et reserveret ord (og, hvis det er det, skal du sikre dig, at det er korrekt citeret).
-
Aaaagh!! Hvad betyder #1064 betyder ?
Fejlmeddelelser kan se ud ligesom gobbledygook, men de er (ofte) utroligt informative og giver tilstrækkelige detaljer til at finde ud af, hvad der gik galt. Ved at forstå præcis, hvad MySQL fortæller dig, kan du ruste dig til at løse ethvert problem af denne art i fremtiden.
Som i mange programmer er MySQL-fejl kodet efter typen det opståede problem. Fejl #1064 er en syntaksfejl.
-
Hvad er denne "syntaks", som du taler om? Er det hekseri?
Mens "syntaks" er et ord, som mange programmører kun støder på i forbindelse med computere, er det faktisk lånt fra bredere lingvistik. Det henviser til sætningsstruktur:altså grammatikkens regler; eller med andre ord de regler, der definerer, hvad der udgør en gyldig sætning inden for sproget.
For eksempel indeholder den følgende engelske sætning en syntaksfejl (fordi den ubestemte artikel "a" altid skal stå foran et substantiv):
Denne sætning indeholder syntaksfejl a.
-
Hvad har det med MySQL at gøre?
Når man udsender en kommando til en computer, er en af de allerførste ting, den skal gøre, at "parse" den kommando for at give mening ud af den. En "syntaksfejl" betyder, at parseren ikke er i stand til at forstå, hvad der bliver spurgt, fordi den ikke udgør en gyldig kommando i sproget:med andre ord, kommandoen overtræder programmeringssprogets grammatik .
Det er vigtigt at bemærke, at computeren skal forstå kommandoen, før den kan gøre noget med den. Fordi der er en syntaksfejl, aner MySQL ikke, hvad man er ude efter og giver derfor op inden den overhovedet ser på databasen og derfor er skemaet eller tabelindholdet ikke relevant.
-
-
Hvordan løser jeg det?
Det er klart, at man skal afgøre, hvordan det er, at kommandoen overtræder MySQL's grammatik. Dette lyder måske ret uigennemtrængeligt, men MySQL prøver virkelig hårdt på at hjælpe os her. Det eneste, vi skal gøre, er...
-
Læs beskeden!
MySQL fortæller os ikke kun præcis hvor parseren stødte på syntaksfejlen, men giver også et forslag til at rette den. Overvej f.eks. følgende SQL-kommando:
UPDATE my_table WHERE id=101 SET name='foo'
Denne kommando giver følgende fejlmeddelelse:
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 fortæller os, at alt virkede fint op til ordet
WHERE
, men så opstod der et problem. Med andre ord forventede den ikke at støde påWHERE
på det tidspunkt.Meddelelser, der siger
...near '' at line...
betyder blot, at slutningen af kommandoen blev stødt på uventet:det vil sige, at noget andet skulle vises, før kommandoen slutter. -
Undersøg den faktiske tekst i din kommando!
Programmører opretter ofte SQL-kommandoer ved hjælp af et programmeringssprog. For eksempel kan et php-program have en (forkert) linje som denne:
$result = $mysqli->query("UPDATE " . $tablename ."SET name='foo' WHERE id=101");
Hvis du skriver dette på to linjer
$query = "UPDATE " . $tablename ."SET name='foo' WHERE id=101" $result = $mysqli->query($query);
så kan du tilføje
echo $query;
ellervar_dump($query)
for at se, at forespørgslen rent faktisk sigerUPDATE userSET name='foo' WHERE id=101
Ofte vil du se din fejl med det samme og være i stand til at rette den.
-
Adlyd ordrer!
MySQL anbefaler også, at vi "tjekker manualen, der svarer til vores MySQL-version for den rigtige syntaks at bruge ". Lad os gøre det.
Jeg bruger MySQL v5.6, så jeg vil henvende mig til denne versions manuelle indtastning for en
UPDATE
kommando . Den allerførste ting på siden er kommandoens grammatik (dette gælder for hver kommando):UPDATE [LOW_PRIORITY] [IGNORE] table_reference SET col_name1={expr1|DEFAULT} [, col_name2={expr2|DEFAULT}] ... [WHERE where_condition] [ORDER BY ...] [LIMIT row_count]
Manualen forklarer, hvordan man fortolker denne syntaks under typografiske og syntakskonventioner , men til vores formål er det nok at erkende, at:klausuler indeholdt i firkantede parenteser
[
og]
er valgfri; lodrette streger|
angiv alternativer; og ellipser...
angive enten en udeladelse for kortheds skyld, eller at den foregående klausul kan gentages.Vi ved allerede, at parseren mente, at alt i vores kommando var i orden før
WHERE
søgeord, eller med andre ord til og med tabelhenvisningen. Ser vi på grammatikken, ser vi dentable_reference
skal efterfølges afSET
nøgleord:hvorimod det i vores kommando faktisk blev efterfulgt afWHERE
søgeord. Dette forklarer, hvorfor parseren rapporterer, at der opstod et problem på det tidspunkt.
Et forbehold
Selvfølgelig var dette et simpelt eksempel. Men ved at følge de to trin, der er skitseret ovenfor (dvs. observere nøjagtig hvor i kommandoen parseren fandt, at grammatikken var overtrådt og sammenlignede med manualens beskrivelse af hvad der var forventet på det tidspunkt ), kan næsten alle syntaksfejl let identificeres.
Jeg siger "stort set alle", fordi der er en lille klasse af problemer, som ikke er helt så lette at få øje på - og det er her, parseren mener, at det sprogelement, der stødes på, betyder én ting, mens du har til hensigt, at det skal betyde en anden. Tag følgende eksempel:
UPDATE my_table SET where='foo'
Igen forventer parseren ikke at støde på
WHERE
på dette tidspunkt og så vil fremkalde en lignende syntaksfejl – men du havde ikke tiltænkt detwhere
at være et SQL nøgleord:du havde til hensigt, at det skulle identificere en kolonne til opdatering! Men som dokumenteret under skemaobjektnavne :Hvis en identifikator indeholder specialtegn eller er et reserveret ord, skal du citer det, når du henviser til det. (Undtagelse:Et reserveret ord, der følger efter et punktum i et kvalificeret navn, skal være en identifikator, så det behøver ikke citeres.) Reserverede ord er angivet på Afsnit 9.3, "Søgeord og reserverede ord" .
[ deletia ]
Identifikations-anførselstegn er backtick ("
`
”):mysql> SELECT * FROM `select` WHERE `select`.id > 100;
Hvis
ANSI_QUOTES
SQL-tilstand er aktiveret, det er også tilladt at citere identifikatorer inden for dobbelte anførselstegn: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)
-