sql >> Databáze >  >> RDS >> Mysql

Jak mohu opravit chybu MySQL # 1064?

TL;DR

Chyba #1064 znamená, že MySQL nerozumí vašemu příkazu. Chcete-li to opravit:

  • Přečtěte si chybovou zprávu. Řekne vám to přesně kde ve vašem příkazu MySQL se zmátlo.

  • Zkontrolujte svůj příkaz. Pokud k vytvoření příkazu používáte programovací jazyk, použijte echo , console.log() , nebo jeho ekvivalent k zobrazení celého příkazu takže to můžete vidět.

  • Projděte si příručku. Porovnáním s tím, co MySQL v tu chvíli očekával , problém je často zřejmý.

  • Vyhledejte vyhrazená slova. Pokud k chybě došlo u identifikátoru objektu, zkontrolujte, zda se nejedná o vyhrazené slovo (a pokud ano, ujistěte se, že je správně citováno).

  1. Aaaagh!! Co znamená #1064 ?

    Chybové zprávy mohou vypadat jako gobbledygook, ale jsou (často) neuvěřitelně informativní a poskytují dostatečné podrobnosti, aby bylo možné určit, co se pokazilo. Když přesně pochopíte, co vám MySQL říká, můžete se vyzbrojit a vyřešit jakýkoli problém tohoto druhu v budoucnu.

    Stejně jako v mnoha programech jsou chyby MySQL kódovány podle typu problému, který nastal. Chyba #1064 je syntaktická chyba.

    • Co je to za "syntaxi", o které mluvíte? Je to čarodějnictví?

      Zatímco „syntaxe“ je slovo, se kterým se mnoho programátorů setkává pouze v kontextu počítačů, ve skutečnosti je vypůjčeno z širší lingvistiky. Týká se struktury vět:tj. pravidel gramatiky; nebo jinými slovy pravidla, která definují, co tvoří platnou větu v rámci jazyka.

      Například následující anglická věta obsahuje chybu syntaxe (protože neurčitý člen „a“ musí vždy předcházet podstatnému jménu):

      Tato věta obsahuje chybu syntaxe a.

    • Co to má společného s MySQL?

      Kdykoli zadáte počítači příkaz, jednou z prvních věcí, které musí udělat, je „analyzovat“ tento příkaz, aby mu dal smysl. "Syntaktická chyba" znamená, že analyzátor není schopen porozumět tomu, co je požadováno, protože to nepředstavuje platný příkaz v rámci jazyka:jinými slovy, příkaz porušuje gramatiku programovacího jazyka .

      Je důležité si uvědomit, že počítač musí příkazu rozumět, než s ním bude moci něco dělat. Protože došlo k chybě syntaxe, MySQL nemá ponětí, o co jde, a proto to vzdá předtím, než se vůbec podívá do databáze a proto schéma nebo obsah tabulky nejsou relevantní.

  2. Jak to opravím?

    Je zřejmé, že je třeba určit, jak to, že příkaz porušuje gramatiku MySQL. Může to znít dost neproniknutelně, ale MySQL se nám zde opravdu snaží pomoci. Vše, co musíme udělat, je…

    • Přečtěte si zprávu!

      MySQL nám nejen říká přesně kde analyzátor narazil na chybu syntaxe, ale také navrhne, jak ji opravit. Zvažte například následující příkaz SQL:

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

      Tento příkaz zobrazí následující chybovou zprávu:

      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 nám říká, že vše vypadalo v pořádku až do slova WHERE , ale pak došlo k problému. Jinými slovy, neočekával, že narazí na WHERE v tom okamžiku.

      Zprávy, které obsahují text ...near '' at line... jednoduše to znamená, že konec příkazu byl zjištěn neočekávaně:to znamená, že před ukončením příkazu by se mělo objevit něco jiného.

    • Zkontrolujte skutečný text svého příkazu!

      Programátoři často vytvářejí příkazy SQL pomocí programovacího jazyka. Například php program může mít (nesprávný) řádek takto:

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

      Pokud to napíšete na dva řádky

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

      pak můžete přidat echo $query; nebo var_dump($query) abyste viděli, že dotaz skutečně říká

      UPDATE userSET name='foo' WHERE id=101
      

      Často svou chybu okamžitě uvidíte a budete ji moci opravit.

    • Poslouchejte příkazy!

      MySQL také doporučuje, abychom si "zkontrolovali správnou syntaxi v příručce, která odpovídá naší verzi MySQL ". Pojďme na to."

      Používám MySQL v5.6, takže se obrátím na ruční zadání této verze pro UPDATE příkaz . Úplně první věcí na stránce je gramatika příkazu (to platí pro každý příkaz):

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

      Příručka vysvětluje, jak interpretovat tuto syntaxi podle Typografických a syntaktických konvencí , ale pro naše účely stačí uznat, že:klauzule obsažené v hranatých závorkách [ a ] jsou volitelné; svislé pruhy | uveďte alternativy; a elipsy ... označují buď vynechání pro stručnost, nebo to, že předchozí věta se může opakovat.

      Již víme, že před příkazem WHERE analyzátor věřil, že vše v našem příkazu je v pořádku klíčové slovo, nebo jinými slovy až do a včetně odkazu na tabulku. Při pohledu na gramatiku vidíme, že table_reference musí následovat SET klíčové slovo:zatímco v našem příkazu bylo ve skutečnosti následováno WHERE klíčové slovo. To vysvětluje, proč analyzátor hlásí, že v tomto okamžiku došlo k problému.

    Poznámka o rezervaci

    Samozřejmě to byl jednoduchý příklad. Dodržením dvou výše uvedených kroků (tj. sledováním přesného místa v příkazu analyzátor zjistil, že gramatika byla porušena, a porovnal s popisem v příručce, co se v tu chvíli očekávalo ), lze prakticky každou chybu syntaxe snadno identifikovat.

    Říkám „prakticky všechny“, protože existuje malá třída problémů, které není tak snadné odhalit – a to je místo, kde analyzátor věří, že prvek jazyka, se kterým se setká, znamená jednu věc, zatímco vy zamýšlíte, aby znamenal něco jiného. Vezměte si následující příklad:

    UPDATE my_table SET where='foo'
    

    Analyzátor opět neočekává, že narazí na WHERE v tomto okamžiku a tak vyvolá podobnou chybu syntaxe – ale neměli jste v úmyslu where být klíčové slovo SQL:měli jste v úmyslu identifikovat sloupec pro aktualizaci! Jak je však zdokumentováno v části Názvy objektů schématu :

    Pokud identifikátor obsahuje speciální znaky nebo je vyhrazeným slovem, musíte citujte jej, kdykoli na něj odkazujete. (Výjimka:Vyhrazené slovo, které následuje za tečkou v kvalifikovaném názvu, musí být identifikátor, takže nemusí být uvozováno.) Vyhrazená slova jsou uvedena na Oddíl 9.3, „Klíčová slova a vyhrazená slova“ .

    [ deletia ]

    Znak uvozovky identifikátoru je zadní zaškrtnutí („` “):

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

    Pokud ANSI_QUOTES Je povolen režim SQL, je také povoleno uvádět identifikátory v uvozovkách:

    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. BeanCreationException:Chyba při vytváření beanu s názvem 'flywayInitializer'

  2. Android:Jak dynamicky načíst obrázek ze serveru podle jeho názvu z SQlite

  3. MySQL:Zobrazit s poddotazem v omezení klauzule FROM

  4. Úplný seznam kolací podporovaných MariaDB