こんにちは、かつコーチです。
MySQLを触り始めると、必ずと言っていいほど遭遇するエラーがいくつかあります。
「Access deniedって出たけどパスワードは合ってるはずなのに」
「Can't connect to MySQL serverって言われて、そもそも接続すらできない」
こうしたエラーは、原因さえ分かれば5分で解決できるものがほとんどです。
この記事では、初心者がつまずきやすいMySQLの代表的なエラーを、実際のエラーメッセージと一緒に原因・対処法を整理します。
エラーメッセージを丸ごとコピーして検索する癖をつけておくと、今後のトラブルシューティングがぐっと楽になります。
接続時によくあるエラー
Access denied for user
最もよく遭遇するのが、この認証エラーです。
ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES)
これは、指定したユーザー名・パスワード・接続元ホストの組み合わせがMySQL側の認証情報と一致していないときに出るエラーです。
原因は主に3つ考えられます。
| 原因 | 確認方法 |
|---|---|
| パスワードが間違っている | パスワードを再入力、または再設定する |
| ユーザーが存在しない | SELECT user, host FROM mysql.user;で確認 |
| ホストの指定が合っていない | 'root'@'localhost'と'root'@'127.0.0.1'は別物として扱われる |
特に3つ目の「ホストの指定違い」は初心者が見落としがちです。
localhostと127.0.0.1は人間から見ると同じ「自分自身」を指しますが、MySQLの内部では接続方式が異なる別の接続元として扱われることがあります(localhostはUNIXソケット経由、127.0.0.1はTCP/IP経由になる場合が多い)。
'root'@'localhost'にしかパスワードを設定していない状態で127.0.0.1指定で接続しようとすると、このエラーが発生します。
-- 現在登録されているユーザーとホストの組み合わせを確認する
SELECT user, host FROM mysql.user;
(using password: YES)の部分は「パスワードを使って接続を試みた」ことを示しており、(using password: NO)と表示された場合はパスワード自体を入力していないことが原因です。
Can’t connect to MySQL server
サーバーへの接続そのものができない場合に出るエラーです。
ERROR 2003 (HY000): Can't connect to MySQL server on 'localhost:3306' (61)
これは、MySQLサーバーが起動していない、またはポート番号が間違っていることが主な原因です。
# MySQLサーバーが起動しているか確認する(macOSの場合)
brew services list
# 起動していなければ起動する
brew services start mysql
Dockerでコンテナ上のMySQLに接続している場合は、ポートフォワーディングの設定漏れが原因になっていることも多いので、docker psでポートのマッピング状況を確認してみてください。
筆者も環境構築の初期に、Dockerコンテナ側だけ起動していてホスト側のポート指定を忘れており、このエラーで30分ほど詰まった経験があります。
(61)のようなカッコ内の数字はOSレベルのエラーコードで、61は「Connection refused(接続が拒否された)」を意味します。
SQL実行時によくあるエラー
Table doesn’t exist
テーブル名を指定したのに見つからない、というエラーです。
ERROR 1146 (42S02): Table 'myapp.Users' doesn't exist
一見スペルミスに見えますが、実はUsersテーブルは存在していてusersという小文字のテーブル名で作られている、というケースがよくあります。
MySQLのテーブル名の大文字小文字の扱いは、OS環境によって挙動が異なります。
| OS | デフォルトの挙動 |
|---|---|
| Linux | 大文字小文字を区別する |
| macOS / Windows | 大文字小文字を区別しない場合が多い |
macOSで開発していたときは動いていたのに、Linuxの本番サーバーにデプロイしたら急に動かなくなった、という話は実務でも起こりがちです。
対策として、テーブル名は常に小文字・スネークケース(user_profilesのように単語をアンダースコアで繋ぐ命名規則)で統一しておくことを強くおすすめします。
Duplicate entry for key
一意制約(同じ値を重複して登録できないようにする制約)に違反したときのエラーです。
ERROR 1062 (23000): Duplicate entry 'taro@example.com' for key 'users.email_unique'
これは、emailカラムにUNIQUE制約(重複を許可しない制約)が設定されているテーブルに、既に登録済みのメールアドレスを再登録しようとした場合に発生します。
-- ❌ Before:重複チェックをせずにINSERTする
INSERT INTO users (email, name) VALUES ('taro@example.com', '田中太郎');
-- ✅ After:事前にチェックするか、INSERT ... ON DUPLICATE KEY UPDATEを使う
INSERT INTO users (email, name) VALUES ('taro@example.com', '田中太郎')
ON DUPLICATE KEY UPDATE name = VALUES(name);
ON DUPLICATE KEY UPDATEは、重複した場合に別の処理(この場合は名前の更新)を行うMySQL独自の便利な構文です。
エラーメッセージ中の'users.email_unique'はどの制約に違反したかを示すキー名なので、テーブル定義を確認すればどのカラムが原因か特定できます。
つまずきやすいポイント・エラー対処
エラーメッセージの読み方のコツ
MySQLのエラーメッセージには、必ずエラー番号(ERROR 1045など)とSQLSTATE(28000のような5桁のコード)が含まれます。
ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES)
^^^^ ^^^^^^^
エラー番号 SQLSTATE
エラー番号は「MySQL固有」の番号、SQLSTATEは「多くのDB製品で共通」の分類コードです。
初心者のうちは、まずエラーメッセージ本文(Access denied for user...の部分)を読んで状況を把握し、原因が分からなければエラー番号ごと検索する、という流れがおすすめです。
エラーメッセージを省略せずそのまま検索することで、同じエラーに遭遇した他の人の解決策に辿り着きやすくなります。
応用・一歩先の使い方(中級読者向けブリッジ)
エラーログを確認する習慣をつける
アプリ側のエラーメッセージだけでは原因が特定しづらい場合、MySQLサーバー自体のエラーログを確認すると手がかりが見つかることがあります。
# macOS(Homebrewでインストールした場合)のエラーログの一例
tail -f /opt/homebrew/var/mysql/*.err
接続系のエラーで原因がはっきりしないときは、アプリ側のログとMySQLサーバー側のログを両方確認する習慣をつけておくと、トラブルシューティングの精度が上がります。
まとめ
この記事のポイント
Access deniedはユーザー名・パスワード・ホストの組み合わせ違いが主な原因Can't connect to MySQL serverはサーバー未起動やポート設定漏れを疑う- テーブル名の大文字小文字はOSによって挙動が異なるため、小文字統一が安全
Duplicate entryは一意制約違反。ON DUPLICATE KEY UPDATEで対処できる場合がある- エラーメッセージは省略せずそのまま検索するのが解決への近道
次に読むべき記事
- 文字化けトラブルシューティング
- ユーザー権限管理:GRANT・REVOKEの基本
タグ: MySQL, 初心者向け, エラー解決