TL; DR
エラー#1064は、MySQLがコマンドを理解できないことを意味します。修正するには:
エラーメッセージを読んでください。 コマンドの正確な場所を教えてくれます MySQLは混乱しました。
コマンドを調べます。 プログラミング言語を使用してコマンドを作成する場合は、
echo
を使用してください 、console.log()
、またはコマンド全体を表示するのと同等です 見ることができます。マニュアルを確認してください。 MySQLがその時点で期待したものと比較することによって 、問題は明らかであることがよくあります。
予約語を確認してください。 オブジェクト識別子でエラーが発生した場合は、それが予約語ではないことを確認してください(予約語の場合は、正しく引用されていることを確認してください)。
-
ああ!! #1064の意味 ?
エラーメッセージは見えるかもしれません gobbledygookに似ていますが、(多くの場合)非常に有益であり、何が悪かったのかを特定するのに十分な詳細を提供します。 MySQLが何を言っているかを正確に理解することで、将来この種の問題を修正するために自分自身を武装させることができます。
多くのプログラムと同様に、MySQLエラーはタイプに従ってコード化されます。 発生した問題の。 エラー#1064 構文エラーです。
-
あなたが話すこの「構文」は何ですか?魔術ですか?
「構文」は、多くのプログラマーがコンピューターのコンテキストでのみ遭遇する単語ですが、実際には、より広い言語学から借用されています。これは文の構造を指します。つまり、文法の規則;または、言い換えると、有効な文を構成するものを定義するルール 言語内。
たとえば、次の英語の文には構文エラーが含まれています(不定冠詞「a」は常に名詞の前に置く必要があるため):
この文には構文エラーaが含まれています。
-
それはMySQLと何の関係がありますか?
コンピュータにコマンドを発行するときはいつでも、それがしなければならない最初のことの1つは、それを理解するためにそのコマンドを「解析」することです。 「構文エラー」とは、言語内で有効なコマンドを構成していないため、パーサーが要求されている内容を理解できないことを意味します。つまり、コマンドがプログラミング言語の文法に違反している 。
コンピュータがコマンドを処理する前に、コマンドを理解する必要があることに注意することが重要です。構文エラーがあるため、MySQLは何を求めているのかわからないため、データベースを調べる前にあきらめます。 したがって、スキーマまたはテーブルの内容は関係ありません。
-
-
修正するにはどうすればよいですか?
明らかに、コマンドが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「キーワードと予約語」 。
[ deletia ]
識別子の引用文字はバッククォートです(“
`
”):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)
-