1. ホーム
  2. mysql

[解決済み] MySQLエラー#1064を修正するにはどうすればよいですか?

2022-03-04 14:57:56

質問

MySQLにコマンドを発行すると、エラー#1064 "シンタックスエラー"が表示されます。

  1. どのような意味ですか?

  2. どうすれば直るのですか?

どのように解決するのですか?

<ブロッククオート

TL;DR

エラー#1064は、MySQLがあなたのコマンドを理解できないことを意味します。 これを修正するには

  • エラーメッセージを読む。 それは、次のことを教えてくれます。 コマンドの MySQLは混乱しました。

  • コマンドを調べる。 プログラミング言語を使ってコマンドを作成する場合は echo , console.log() またはそれに相当するものを表示します。 コマンド全体 を表示させることができます。

  • マニュアルを確認する MySQLの設定と比較することで その時点で期待される 問題は明白です。

  • 予約語をチェックする。 オブジェクト識別子でエラーが発生した場合、それが予約語でないことを確認します (予約語である場合は、適切に引用されていることを確認します)。

  1. ああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああ 1064は何をするのか 意味 ?

    エラーメッセージは次のようなものがあります。 見る しかし、何が問題だったのかを特定するのに十分な情報を提供してくれます。 MySQL が教えてくれることを正確に理解することで、将来この種の問題が発生したときに、それを解決することができるようになります。

    多くのプログラムと同様に、MySQL のエラーは タイプ が発生しました。 エラー番号1064 は構文エラーです。

    • あなたの言う「構文」とは何ですか? 魔術ですか?

      シンタックス(syntax)とは、多くのプログラマーがコンピュータの文脈でしか目にしない言葉ですが、実は広く言語学から借用したものなのです。 これは、文の構造を意味します。 文法規則 言い換えれば、何をもってして 有効文 という言語があります。

      例えば、次の英文には構文エラーがあります(不定冠詞 "a" は必ず名詞の前に置かなければならないため)。

      <ブロッククオート

      この文は構文エラーaを含んでいます。

    • MySQLとどう関係があるのですか?

      コンピュータにコマンドを発行すると、まずそのコマンドを理解するために解析する必要があります。 構文エラーとは、その言語で有効なコマンドを構成していないため、パーサーが質問された内容を理解できないことを意味します。 コマンドはプログラミング言語の文法に違反しています。 .

      ここで重要なのは、コンピュータがコマンドを理解しなければ、そのコマンドで何かをすることはできないということです。 構文エラーがあるため、MySQL は何を求めているのかがわからず、そのためあきらめます。 データベースを見る前に したがって、スキーマやテーブルの内容は関係ありません。

  2. どうすれば直るの?

    明らかに、そのコマンドが MySQL の文法に違反していることを確認する必要があります。 これはかなり難解に聞こえるかもしれませんが、MySQL はここで私たちを助けようと懸命に努力しています。 私たちがすべきことは...

    • メッセージを読む

      MySQL は、以下のことを教えてくれるだけではありません。 まさに パーサーはどこで構文エラーに遭遇したか、またそれを修正するための提案も行います。 例えば、次のようなSQLコマンドを考えてみましょう。

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

      このコマンドを実行すると、次のようなエラーメッセージが表示されます。

      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 は、この単語まではすべてうまくいっていたようだと伝えています。 WHERE しかし、その後、問題が発生しました。 言い換えれば、それは WHERE ということになります。

      というメッセージは ...near '' at line... は、単にコマンドの終了が予期せぬものであったことを意味します。つまり、コマンドが終了する前に何か他のものが現れるはずです。

    • コマンドの実際のテキストを検証してみましょう

      プログラマーは、しばしばプログラミング言語を使ってSQLコマンドを作成します。例えば、phpのプログラムでは、次のような(間違った)行があるかもしれません。

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

      これを2行で書くと

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

      を追加すると echo $query; または var_dump($query) をクリックすると、クエリが実際に次のように表示されることを確認できます。

      UPDATE userSET name='foo' WHERE id=101
      
      

      多くの場合、すぐにエラーが表示され、それを修正することができます。

    • 命令に従え!

      また、MySQLは、以下のことを推奨しています。 使用する正しい構文については、MySQL のバージョンに対応するマニュアルを確認してください。 となります。 そうしましょう。

      MySQL v5.6を使用しているので、次に回すのは そのバージョンのマニュアルにある UPDATE コマンド . ページの一番最初にあるのは、コマンドの文法です(これはすべてのコマンドに当てはまります)。

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

      の下でこの構文の解釈の仕方をマニュアルで説明しています。 組版・構文規則 しかし、ここでは、次のことを認識すれば十分である:角括弧内に含まれる節 [] は任意で、縦棒 | は代替案を示し、楕円は ... は、簡潔さのための省略、または前の節が繰り返される可能性があることを示す。

      パーサーは、このコマンドに含まれるすべてのものが WHERE キーワード、言い換えればテーブル参照までが含まれる。 文法を見てみると table_reference は、その後に SET キーワードがあります。 WHERE というキーワードがあります。 このため、パーサーはその時点で問題が発生したと報告するのです。

    予約の注意事項

    もちろん、これは単純な例である。 しかし、上記の2つのステップを踏むことで、(すなわち コマンドのどこに という文法違反を発見し、マニュアルに書かれている その時点で期待されていること )、事実上すべてのシンタックスエラーを容易に特定することができます。

    事実上すべて」と言ったのは、そう簡単には発見できない問題もあるからです。それは、パーサーが、遭遇した言語要素が、あなたが意図したのとは別のことを意味していると思い込んでしまう場合です。 次のような例を考えてみましょう。

    UPDATE my_table SET where='foo'
    
    

    ここでも、パーサーは WHERE この時点で同様の構文エラーを発生させますが、あなたが意図していない where はSQLキーワードであり、更新するカラムを特定するためのものだったのです! しかし、以下のドキュメントで説明されているように スキーマオブジェクト名 :

    識別子に特殊文字が含まれていたり、予約語である場合は しなければならない を引用してください。(例外。(例外:修飾名のピリオドに続く予約語は識別子でなければならないので、引用する必要はありません)。 予約語の一覧は 9.3項 "キーワードと予約語" .

    [ 
    
    
    デレステ
    
    
     ]
    

    識別子の引用文字がバックティック(" ` "):

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

    もし ANSI_QUOTES SQLモードが有効な場合、識別子を二重引用符で囲むことも可能である。

    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)