質問: rs.getString("短縮名"); System.out.println(com); rs.close(); stmt.close(); conn.close(); System.out.print("成功"); } catch (Exception e) { System.out.println("JDBCドライバのロードに失敗しました。"); } } } ### 試したこと データベース名の後の ?autoReconnect=true&useSSL=false" を削除しても同じエラーが出ました。 Class.forName("com.mysql.jdbc.NonRegisteringDriver"); を削除しても同じエラーが出ました。 eclipseのプラグインのDBViewerからは接続できましたが、 コードからだとエラーが出てしまうようです。 ### 補足情報(FW/ツールのバージョンなど) eclipse neon4.6 mysql5.7
回答: 2点ご確認ください。 ### 接続先のデータベース エラーメッセージに"Unknown database "と出ているので接続先データベースが見つかっていないように思います。 jdbc urlに指定しているデータベース名は正しいでしょうか? ``` com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Unknown database 'test' ``` もし、ローカルPCにmysqlかmysql clientがインストールされている場合、次のコマンドでアクセスできるかご確認ください。 ``` > mysql.exe --host=接続先ホスト名 --port=3306 --user=ユーザー --password=パスワード --database=データベース名 ``` ### 接続先のホスト名 ご提示されたコードのjdbc urlには"PCのID"と書かれていますが、これは実際のコードでは接続先の”ホスト名”または”ホストのIP”が書かれているということでしょうか? A5:SQL Mk-2では接続できるとのことですが、このツールのDB接続設定のホスト名の内容と同一でしょうか? ``` String url = "jdbc:mysql://PCのID:3306/データベース名?autoReconnect=true&useSSL=false"; ``` 念のため、コマンドプロンプトからpingで疎通できるかご確認ください。 ``` > ping 接続先のホスト名 ``` それと、ちょっと気になっている点があります。質問文の以下の > > 別のPCのMysqlにアクセスしようとすると次のようなエラーが出てしまいます。 > > > "別のPC"というのは、チームで開発する際に複数のメンバーで接続する用途のいわゆるサーバータイプのPCでしょうか? ちょっと気になっただけなので、差支えがあればお答え頂かなくても結構です。 ### 確認点 (2018/08/08追加) コメントありがとうございます。ローカルからmysql.exeでは接続できないけど、A5:SQL Mk-2からは接続できるということなので、もう少し状況確認をさせてください。 **結果追記 (2018/08/10)** 確認点をコメントして頂いたので、見やすいようにそれぞれの項目に結果を追記しました。 #### bind_addressとportの確認 MySQL serverが実行されているPC上で、mysql.exeを使ってrootユーザーでログインして次のsqlを実行してください。 このsqlの結果を確認したいと思います。 bind_address ``` > show variables like '%bind%'; ``` **結果追記** ``` bind_address * 1 row in set, 1 warning (0.27 sec) ``` port ``` > show variables like '%port%'; ``` **結果追記** ``` innodb_support ON large_files_support ON port 3306 report_host report_password report_port 3306 report_user require_secure_transport OFF 8 rows in set, 1 warning(0.00 sec) ``` #### netstatでportの確認 MySQL serverが実行されているPC上で、Windowsのnetstatコマンドの結果を確認したいです。 出力結果が長いかもしれませんが"ローカル アドレス"の欄にx.x.x.x:3306のような結果があるか確認してください。この場合の3306は上記で確認したportに読み替えてください。(上記のportの確認結果がたとえば13306だったら、x.x.x.x:13306を確認する、という意味です。) コマンドプロントを立ち上げ次のコマンドを実行してください。 ``` > netstat -anoptf TCP ``` 下記の例のような行があるかを確認したいです。 ``` アクティブな接続 プロトコル ローカル アドレス 外部アドレス 状態 PID オフロード状態 TCP 0.0.0.0:3306 0.0.0.0:0 LISTENING 18596 ホスト内 ``` ローカルアドレスに上記の例のような行がある場合、さらにtohokukagakuさんのPCからA5:SQL Mk-2で接続して、再度結果を確認してください。 このときの外部アドレスがどのように変わったか確認したいです。 **結果追記** > > はじめは下記の例と同じ内容が行がありました(PIDのみ違う数字) > > A5:SQL Mk-2に接続後も変わらず同じ数字で存在しましたが、新しく下記の行が増えました。(pidとオフロード状態は同じ数字でした。) > > > ``` ローカルアドレス 外部アドレス 状態 接続先ホストのID:3306 接続先ホストのIDの下二桁のみ違う数字:50525 ESTABLISHED ``` #### DBユーザーのアクセス権限 MySQL serverが実行されているPC上で、mysql.exeを使ってrootユーザーでログインして次のsqlを実行してください。 このsqlの結果を確認したいと思います。 仮に、接続したいユーザー名が'test_user'だとしたら、以下のようなsqlになると思います。 'test_user'の部分は、実際に接続したいユーザーの名前に読み替えてください。(eclipseのプログラムやA5:SQL Mk-2から接続するときのユーザー名です。) ``` > select user,host from mysql.user where user = 'test_user'; ``` 下記は一例ですが、hostに * 'localhost'があるか * tohokukagakuさんのPCのIPアドレスがあるか(たとえば、tohokukagakuさんのPCのIPが10.0.75.1だとしたら、下記のように10.0.75.%かもしくは10.0.75.1があるか) の点を確認したいと思います。 ``` +---------------+-------------+ | user | host | +---------------+-------------+ | test_user | 10.0.75.% | | test_user | localhost | +---------------+-------------+ ``` **結果追記** ``` myspl % 1 rdw in set(0.05 sec) ``` また、以下のshow grantsで接続したいユーザーが接続したいデータベースに権限が付与されているか確認したいです。 このsql文の'test_user'@'10.0.75.%'の部分は実際に接続したいユーザーに読み替えてください。 ``` > show grants for 'test_user'@'10.0.75.%'; ``` 下記は一例ですが、GRANT ALL PRIVILEGES ON `test`.* TO 'test_user'@'10.0.75.%' のような行があるか確認したいです。 ``` +-----------------------------------------------------------------------+ | Grants for test_user@10.0.75.% | +-----------------------------------------------------------------------+ | GRANT USAGE ON *.* TO 'test_user'@'10.0.75.%' | | GRANT ALL PRIVILEGES ON `test`.* TO 'test_user'@'10.0.75.%' | +-----------------------------------------------------------------------+ ``` **結果追記** ``` Grants for mysql`% GRANT ALL PRIVILEGES ON *.* TO "mysql"@"%" WITH GRANT OPTION ``` #### MySQL serverが実行されているPCからの接続 上記のアクセス権限の確認結果にlocalhostが含まれている場合に、この確認を行って頂きたいです。 tohokukagakuさんのPCからmysql.exeでは接続できなかったということですが、MySQL serverが実行されているPCからの接続はどうでしょうか? MySQL serverが稼働しているPCから、mysql.exeを使って接続したいユーザーでログインできるか確認してください。 test_userとtest_passの部分は実際に接続したいユーザー名とパスワードに読み替えてください。 ``` > mysql.exe --host=localhost --port=3306 --user=test_user --password=test_pass --database=test ``` #### ローカルPCから接続できなかったときのエラーメッセージ 頂いたコメントで、ローカルPCからは接続できなかったということですが、このときのエラーメッセージはどのようなものでしょうか? > > > mysql.exe --host=接続先ホスト名 --port=3306 --user=ユーザー --password=パスワード --database=データベース名 > > 試してみましたが接続することができませんでした。 > > > **結果追記** > > ローカルPCからの接続エラーは下記のように出ました。 > > 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 'mysql.exe --host=接続先ホストID --port=3306 --user=mysql --password=パスワード -' at line 1 > > > また、データベース名の指定ですが、A5:SQL Mk-2の接続設定のデータベースの欄の名前です。この場合はデータベース名とスキーマ名は同じと考えてよいと思います。 > > 自分は接続先データベース名は A5:SQL Mk-2 のスキーマと同じだと思い、"test" にしているのですがもしかして間違いでしたか? > > > A5:SQL Mk-2からは接続できるということですが、たとえば、A5:SQL Mk-2の接続設定が下図のようなものだとして、 !イメージ説明 下記のように同じ設定でもmysql.exeからは接続できないということでしょうか? 設定は、tohokukagakuさんのPCのA5:SQL Mk-2の接続設定に読み替えてください。 ``` > mysql.exe --host=10.75.0.200 --port=3306 --user=test_user --password=test_pass --database=test ``` **結果追記** > > A5:SQL Mk-2からは接続設定と > > mysql.exe --host=10.75.0.200 --port=3306 --user=test_user --password=test_pass --database=test > > を見比べましたが、違いはありませんでした。 > > > #### ローカルPCにMySQL serverはインストールされていますか mysql.exeで接続確認をされたということですが、ローカルPCにMySQL serverがインストールされているということでしょうか? もしそうであれば、ローカルPCのMySQL serverが稼働していてA5:SQL Mk-2がそこへ接続しているということはないでしょうか? **結果追記** > > ローカルPCのmysqlにはtestというデータベースは作成していませんのでA5:SQL Mk-2がそこへ接続しているということはないと思います。 > > > 以上、すこし項目が多いですがご確認ください。