メインコンテンツへスキップ

VillageSQL is a drop-in replacement for MySQL with extensions.

All examples on this page work on VillageSQL. Install Now →
MySQL のサポートの質問の大半は、5 つのエラーで占められています。以下では、それぞれをサーバーが出力するとおりに示し、実際の意味と修正方法を説明します。これらはすべて VillageSQL でもまったく同じように動作します。

ERROR 2002: ソケット経由で接続できない

クライアントはサーバーに到達していません。これは認証の問題ではなく接続の問題です。サーバーが実行されていないか、クライアントが誤った場所を探しています。(2) は errno 2、「no such file」(そのようなファイルはない)です。
  • サーバーが起動していることを確認します: pgrep mysqld またはサービスマネージャーを使います。
  • mysql -h localhost は Unix ソケットを使います。サーバーが別のソケットパスで待ち受けている場合は、それを渡します: mysql -S /path/to/mysql.sock。
  • ソケットの代わりに TCP を強制するには、-h localhost ではなく -h 127.0.0.1 を使います。

ERROR 1045: アクセス拒否

2002 とは逆です。サーバーには到達しましたが、サーバーが資格情報を拒否しました。メッセージを正確に読んでください。3 つの事実が示されています。
  • サーバーがあなたをどのユーザーとみなしているか。
  • どのホストから接続したか。MySQL のアカウントは user@host の組です。'app'@'localhost' と 'app'@'%' は、パスワードも権限も異なる別のアカウントです。
  • using password: YES/NO — パスワードがそもそも送られたかどうか。NO は多くの場合、クライアントが読み取った環境や構成ファイルにパスワードが見つからなかったことを意味します。
修正するには、自分のホストに対してどのアカウントが存在するかを確認し(管理者として SELECT user, host FROM mysql.user;)、ALTER USER でそのパスワードをリセットします。ユーザー管理を参照してください。

ERROR 1055: ONLY_FULL_GROUP_BY

これを引き起こしたクエリは次のとおりです。
各グループには 1 つの customer_id がありますが、total の値は多数あり、クエリはどれが欲しいのかを示していません。古い MySQL のバージョンは任意の 1 つを選んでいました。5.7 以降、デフォルトの ONLY_FULL_GROUP_BY モードがこれをエラーにします。これは、もともと誤っていたクエリからあなたを守っているのです。本当の修正は 3 つあります。
sql_mode で ONLY_FULL_GROUP_BY を無効にしても動作しますが、それは誤った答えです。エラーを、静かに任意の結果を返す状態に戻してしまいます。ANY_VALUE() が何を約束し、何を約束しないかについては、MySQL の GROUP BY のパフォーマンスを参照してください。

ERROR 1064: 構文エラー

引用された断片は、パーサーが受け入れられなかった最初のトークンから始まります。そのため、実際の誤りは引用の開始位置か、その直前にあります。よくある原因は、キーワードのタイプミス、列リストのカンマの欠落、バッククォートなしで識別子として使われた予約語、またはステートメントの半分を文字列に変えてしまった余分な引用符です。

ERROR 1062: 重複エントリ

ユニーク制約が仕事をしました。メッセージが値とインデックスを示しているため、診断は済んでいます。決めるべきは、その挿入が何を意味すべきかです。
  • 行が 2 回存在すべきではない場合: 重複キーの生成元を修正します。
  • 挿入の代わりに既存の行を更新すべき場合: INSERT ... ON DUPLICATE KEY UPDATE を使います。Upsert を参照してください。
  • 挿入を静かにスキップすべき場合: INSERT IGNORE を使います。ただし、他のエラーも黙らせてしまうため、控えめに使ってください。

あらゆる MySQL のエラーの読み方

ERROR <number> (<SQLSTATE>): <message> というパターンは 3 つのシグナルを運びます。番号は MySQL 固有で、最良の検索キーです。SQLSTATE のクラスは移植性があります。28000 は認証、42000 はクエリの問題、23000 は制約違反、HY000 は汎用のバケットです。クライアント側のエラー(2002 のような 2xxx)はサーバーに到達していません。サーバー側のエラー(1xxx)は接続が機能していることを意味します。

関連項目