sql >> Database >  >> RDS >> Mysql

Hoe kan ik MySQL-fout #1064 oplossen?

TL;DR

Fout #1064 betekent dat MySQL uw opdracht niet kan begrijpen. Om het te repareren:

  • Lees de foutmelding. Het vertelt je precies waar in je commando MySQL raakte in de war.

  • Bekijk je commando. Als je een programmeertaal gebruikt om je commando te maken, gebruik dan echo , console.log() , of het equivalent daarvan om de hele opdracht te tonen zodat je het kunt zien.

  • Controleer de handleiding. Door te vergelijken met wat MySQL op dat moment verwachtte , het probleem is vaak duidelijk.

  • Controleer op gereserveerde woorden. Als de fout is opgetreden bij een object-ID, controleer dan of het geen gereserveerd woord is (en als dat wel het geval is, zorg er dan voor dat het correct wordt geciteerd).

  1. Aaaah!! Wat betekent #1064 betekent ?

    Foutmeldingen kunnen eruit zien zoals gobbledygook, maar ze zijn (vaak) ongelooflijk informatief en bieden voldoende details om vast te stellen wat er mis is gegaan. Door precies te begrijpen wat MySQL u vertelt, kunt u zich wapenen om dit soort problemen in de toekomst op te lossen.

    Zoals in veel programma's, worden MySQL-fouten gecodeerd volgens het type van het probleem dat zich heeft voorgedaan. Fout #1064 is een syntaxisfout.

    • Wat is deze "syntaxis" waarover u spreekt? Is het hekserij?

      Hoewel "syntaxis" een woord is dat veel programmeurs alleen tegenkomen in de context van computers, is het in feite ontleend aan de bredere taalkunde. Het verwijst naar de zinsstructuur:d.w.z. de grammaticaregels; of, met andere woorden, de regels die bepalen wat een geldige zin is binnen de taal.

      De volgende Engelse zin bevat bijvoorbeeld een syntaxisfout (omdat het onbepaalde lidwoord "a" altijd vooraf moet gaan aan een zelfstandig naamwoord):

      Deze zin bevat syntaxisfout a.

    • Wat heeft dat met MySQL te maken?

      Telkens wanneer iemand een commando aan een computer geeft, is een van de allereerste dingen die het moet doen, dat commando "parseren" om het te begrijpen. Een "syntaxisfout" betekent dat de parser niet kan begrijpen wat er wordt gevraagd omdat het geen geldig commando in de taal is:met andere woorden, het commando schendt de grammatica van de programmeertaal .

      Het is belangrijk op te merken dat de computer de opdracht moet begrijpen voordat hij er iets mee kan doen. Omdat er een syntaxisfout is, heeft MySQL geen idee waar men naar op zoek is en geeft het daarom op voordat het zelfs maar naar de database kijkt en daarom is de inhoud van het schema of de tabel niet relevant.

  2. Hoe los ik het op?

    Het is duidelijk dat men moet bepalen hoe het komt dat het commando de grammatica van MySQL schendt. Dit klinkt misschien ondoorgrondelijk, maar MySQL doet zijn best om ons hier te helpen. Het enige wat we hoeven te doen is...

    • Lees het bericht!

      MySQL vertelt ons niet alleen exact waar de parser de syntaxisfout heeft aangetroffen, maar ook een suggestie doet om deze te herstellen. Beschouw bijvoorbeeld het volgende SQL-commando:

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

      Dat commando levert de volgende foutmelding op:

      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 vertelt ons dat alles in orde leek tot het woord WHERE , maar toen deed zich een probleem voor. Met andere woorden, het verwachtte niet WHERE . tegen te komen op dat moment.

      Berichten met de tekst ...near '' at line... betekent gewoon dat het einde van de opdracht onverwachts werd gevonden:dat wil zeggen dat er iets anders zou moeten verschijnen voordat de opdracht eindigt.

    • Bekijk de eigenlijke tekst van je commando!

      Programmeurs maken vaak SQL-opdrachten met behulp van een programmeertaal. Een php-programma kan bijvoorbeeld een (verkeerde) regel hebben zoals deze:

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

      Als je dit in twee regels schrijft

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

      dan kun je echo $query; . toevoegen of var_dump($query) om te zien dat de zoekopdracht eigenlijk zegt

      UPDATE userSET name='foo' WHERE id=101
      

      Vaak zie je je fout meteen en kun je deze herstellen.

    • Gehoorzaam aan bevelen!

      MySQL beveelt ook aan dat we "de handleiding controleren die overeenkomt met onze MySQL-versie voor de juiste syntaxis om te gebruiken ". Laten we dat doen.

      Ik gebruik MySQL v5.6, dus ik ga naar handmatige invoer van die versie voor een UPDATE commando . Het allereerste op de pagina is de grammatica van het commando (dit geldt voor elk commando):

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

      De handleiding legt uit hoe u deze syntaxis moet interpreteren onder Typografische en syntaxisconventies , maar voor onze doeleinden is het voldoende om te erkennen dat:clausules tussen vierkante haken [ en ] zijn optioneel; verticale balken | alternatieven aangeven; en weglatingstekens ... duiden ofwel een weglating aan voor de beknoptheid, of dat de voorgaande clausule mag worden herhaald.

      We weten al dat de parser geloofde dat alles in onze opdracht in orde was voorafgaand aan de WHERE trefwoord, oftewel tot en met de tabelverwijzing. Als we naar de grammatica kijken, zien we dat table_reference moet worden gevolgd door de SET trefwoord:terwijl het in onze opdracht werd gevolgd door de WHERE trefwoord. Dit verklaart waarom de parser meldt dat er op dat moment een probleem is opgetreden.

    Een notitie van reservering

    Dit was natuurlijk een simpel voorbeeld. Door echter de twee hierboven beschreven stappen te volgen (d.w.z. precies te observeren waar in de opdracht de parser constateerde dat de grammatica werd geschonden en vergeleek met de beschrijving in de handleiding van wat op dat moment werd verwacht ), kan vrijwel elke syntaxisfout gemakkelijk worden geïdentificeerd.

    Ik zeg "vrijwel alle", omdat er een kleine klasse van problemen is die niet zo gemakkelijk te herkennen zijn - en dat is waar de parser gelooft dat het gevonden taalelement het ene betekent, terwijl je bedoelt dat het iets anders betekent. Neem het volgende voorbeeld:

    UPDATE my_table SET where='foo'
    

    Nogmaals, de parser verwacht WHERE . niet tegen te komen op dit punt en zal dus een vergelijkbare syntaxisfout opleveren, maar daar was je niet voor bedoeld where om een ​​SQL-trefwoord te zijn:je had bedoeld dat het een kolom zou identificeren om bij te werken! Echter, zoals gedocumenteerd onder Schema Object Names :

    Als een identifier speciale tekens bevat of een gereserveerd woord is, moet citeer het telkens als je ernaar verwijst. (Uitzondering:een gereserveerd woord dat op een punt in een gekwalificeerde naam volgt, moet een identifier zijn, dus het hoeft niet tussen aanhalingstekens te worden geplaatst.) Gereserveerde woorden worden vermeld op Sectie 9.3, "Trefwoorden en gereserveerde woorden" .

    [ deletia ]

    Het identifier-aanhalingsteken is de backtick (“` ”):

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

    Als de ANSI_QUOTES SQL-modus is ingeschakeld, het is ook toegestaan ​​om identifiers tussen dubbele aanhalingstekens te citeren:

    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)


  1. Vind waarden die geen getallen bevatten in MySQL

  2. Postgresql UUID ondersteund door Hibernate?

  3. Zelfstudie gegevens:Vensterfuncties gebruiken

  4. Een tussenliggende MySQL- of MariaDB-master vervangen door een Binlog-server met MaxScale