JavaとMySQLで発生するJDBCエラー「Unknown database」の原因と解決方法
JDBCエラー「Unknown database」とは?
このエラーは、MySQLに存在しないデータベースを指定して接続しようとした場合に発生します。JDBCでデータベースに接続する際、接続URL内のデータベース名が実際には存在しないと、「Unknown database(不明なデータベース)」という例外がスローされます。
ここでは、まずエラーが実際にどのように表示されるかを確認し、その後の解決方法を解説します。
エラーが発生するサンプルコード
以下はJavaのコード例です。ここでは、存在しないデータベース「onlinebookstore」を接続先として指定しています。
import java.sql.Connection;
import java.sql.DriverManager;
public class UnknownDatabaseDemo {
public static void main(String[] args) {
String JdbcURL = "jdbc:mysql://localhost:3306/onlinebookstore?useSSL=false";
String Username = "root";
String password = "123456";
Connection con = null;
try {
con = DriverManager.getConnection(JdbcURL, Username, password);
System.out.println("Connected to MySQL database");
} catch (Exception e) {
e.printStackTrace();
}
}
}エラーの出力結果
上記のコードを実行すると、次のようなスタックトレースが出力されます。ポイントは最初の行にある「MySQLSyntaxErrorException: Unknown database 'onlinebookstore'」というメッセージです。
com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Unknown database 'onlinebookstore'
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source)
at java.lang.reflect.Constructor.newInstance(Unknown Source)
at com.mysql.jdbc.Util.handleNewInstance(Util.java:425)
at com.mysql.jdbc.Util.getInstance(Util.java:408)
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:944)
at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3978)
at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3914)
at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:871)
at com.mysql.jdbc.MysqlIO.proceedHandshakeWithPluggableAuthentication(MysqlIO.java:1714)
at com.mysql.jdbc.MysqlIO.doHandshake(MysqlIO.java:1224)
at com.mysql.jdbc.ConnectionImpl.coreConnect(ConnectionImpl.java:2199)
at com.mysql.jdbc.ConnectionImpl.connectOneTryOnly(ConnectionImpl.java:2230)
at com.mysql.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:2025)
at com.mysql.jdbc.ConnectionImpl.(ConnectionImpl.java:778)
at com.mysql.jdbc.JDBC4Connection.(JDBC4Connection.java:47)
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source)
at java.lang.reflect.Constructor.newInstance(Unknown Source)
at com.mysql.jdbc.Util.handleNewInstance(Util.java:425)
at com.mysql.jdbc.ConnectionImpl.getInstance(ConnectionImpl.java:386)
at com.mysql.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:330)
at java.sql.DriverManager.getConnection(Unknown Source)
at java.sql.DriverManager.getConnection(Unknown Source)
at UnknowDatabaseDemo.main(UnknowDatabaseDemo.java:15)エラー画面のスクリーンショットは以下の通りです。

エラーの解決方法
この種のエラーを解消するには、MySQLのコマンドラインにアクセスし、SHOW DATABASESコマンドを使って実際に存在するデータベースの一覧を確認します。そして、その中から本当に存在するデータベースを選んで接続URLに指定すればOKです。
ここでは多数のデータベースの中から「hb_student_tracker」というデータベースを選択します。以下はSHOW DATABASESコマンドで取得した全データベース名の一覧です。

修正後のJDBCコード
次に、存在するデータベース「hb_student_tracker」に接続するよう修正したJDBCコードを示します。
import java.sql.Connection;
import java.sql.DriverManager;
public class UnknownDatabaseDemo {
public static void main(String[] args) {
String JdbcURL = "jdbc:mysql://localhost:3306/hb_student_tracker?useSSL=false";
String Username = "root";
String password = "123456";
Connection con = null;
try {
con = DriverManager.getConnection(JdbcURL, Username, password);
System.out.println("Connected to MySQL database");
} catch (Exception e) {
e.printStackTrace();
}
}
}実行すると、今度は正常に接続され、コンソールに「Connected to MySQL database」と表示されます。出力結果のスクリーンショットは以下の通りです。

まとめ
JDBCの「Unknown database」エラーは、接続URLに指定したデータベースがMySQLサーバー上に存在しないことが原因です。対処法としては、以下の手順が有効です。
- MySQLコマンドラインでSHOW DATABASESを実行し、存在するデータベースを確認する
- 接続URLのデータベース名を、実際に存在するものに修正する
- データベース名のスペルミスや大文字・小文字の違いがないかも併せてチェックする
もし目的のデータベースがまだ作成されていない場合は、CREATE DATABASE文で事前に作成しておくことも忘れないようにしましょう。
-
JavaでIPアドレスを指定してMySQLに接続する方法
JavaからIPアドレス経由でMySQLデータベースに接続するには、DriverManager.getConnection()メソッドの引数にJDBC形式のMySQL URLを指定します。URL内のホスト名の部分にIPアドレスを記述すれば、ネットワーク上の別マシンで稼働しているMySQLサーバーへ直接接続することが可能です。 JDBC URLの構成要素 接続用URLは次のような形式で記述します。 jdbc:mysql://[IPアドレス]:[ポート番号]/[データベース名]?[オプション] IPアドレス:接続先MySQLサーバーが動作しているマシンのアドレス(例:192.168.43.14
-
JDBCでMySQLのバックスラッシュをエスケープするには?PreparedStatementの使い方を解説
PreparedStatementでバックスラッシュを安全にエスケープするMySQLにデータを挿入する際、バックスラッシュ(\)などの特殊文字を安全に扱うには、PreparedStatementを使用するのが最も確実な方法です。PreparedStatementはパラメータを自動的にエスケープしてくれるため、手動で「\\」のように置き換える必要がなく、SQLインジェクション対策としても有効です。まず、サンプル用のテーブルを作成しましょう。mysql> create table DemoTable1904 ( ClientId int, ClientName var