Итак, я получаю сообщение об ошибке java.sql.SQLException: Access denied for user ''@'localhost' (using password: NO)
, когда пытаюсь подключиться к MySQL базе данных из Java кода. Все, что мне удалось найти, не решило проблему вообще, а код очень простой c. Раньше я использовал его в проектах и нашел его во многих уроках. Итак, сначала соответствующий код:
//Inside class that manages SQLConnection
public SQLTransceiver(String url){
this.connectionURL = url;
this.reconnect();
}
public void reconnect(){
try {
Connection connection = DriverManager.getConnection(this.connectionURL); //Where the error occurs
this.currentConnection = connection;
} catch (SQLException e) {
e.printStackTrace();
}
}
//Inside main class I call this for testing purpose
String s = "jdbc:mysql://localhost:3306/tableName" +
"?user=user" +
"&password=thePassword" +
"&serverTimezone=MET";
DataTransreciever transreciever = new SQLTransceiver(s);
ПРИМЕЧАНИЕ: я могу отлично войти в базу данных в MySQL workbench и делать там все, от создания / изменения таблиц до вставки и всего прочего.
Весь Stacktrace выглядит так:
java.sql.SQLException: Access denied for user ''@'localhost' (using password: NO)
at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:129)
at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:97)
at com.mysql.cj.jdbc.exceptions.SQLExceptionsMapping.translateException(SQLExceptionsMapping.java:122)
at com.mysql.cj.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:836)
at com.mysql.cj.jdbc.ConnectionImpl.<init>(ConnectionImpl.java:456)
at com.mysql.cj.jdbc.ConnectionImpl.getInstance(ConnectionImpl.java:246)
at com.mysql.cj.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:197)
at java.sql.DriverManager.getConnection(DriverManager.java:664)
at java.sql.DriverManager.getConnection(DriverManager.java:208)
at main.data.SQLTransceiver.reconnect(SQLTransceiver.java:31)
at main.data.SQLTransceiver.<init>(SQLTransceiver.java:20)
at main.ui.toDoPane.ToDoPane.<init>(ToDoPane.java:208)
at main.ui.Window.start(Window.java:40)
at com.sun.javafx.application.LauncherImpl.lambda$launchApplication1$161(LauncherImpl.java:863)
at com.sun.javafx.application.PlatformImpl.lambda$runAndWait$174(PlatformImpl.java:326)
at com.sun.javafx.application.PlatformImpl.lambda$null$172(PlatformImpl.java:295)
at java.security.AccessController.doPrivileged(Native Method)
at com.sun.javafx.application.PlatformImpl.lambda$runLater$173(PlatformImpl.java:294)
at com.sun.glass.ui.InvokeLaterDispatcher$Future.run(InvokeLaterDispatcher.java:95)
at com.sun.glass.ui.win.WinApplication._runLoop(Native Method)
at com.sun.glass.ui.win.WinApplication.lambda$null$147(WinApplication.java:177)
at java.lang.Thread.run(Thread.java:748)
Итак, что я сделал, чтобы исправить это: это заставило меня задуматься, почему в нем не указано, какому пользователю было отказано, обратите внимание, что в нем указано «Запрещено для пользователя» @ 'localhost'. Итак, я ввел неправильный пароль, и появилась эта ошибка:
java.sql.SQLException: Access denied for user 'root'@'localhost' (using password: YES)
at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:129)
at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:97)
at com.mysql.cj.jdbc.exceptions.SQLExceptionsMapping.translateException(SQLExceptionsMapping.java:122)
at com.mysql.cj.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:836)
at com.mysql.cj.jdbc.ConnectionImpl.<init>(ConnectionImpl.java:456)
at com.mysql.cj.jdbc.ConnectionImpl.getInstance(ConnectionImpl.java:246)
at com.mysql.cj.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:197)
at java.sql.DriverManager.getConnection(DriverManager.java:664)
at java.sql.DriverManager.getConnection(DriverManager.java:208)
at main.data.SQLTransceiver.reconnect(SQLTransceiver.java:31)
at main.data.SQLTransceiver.<init>(SQLTransceiver.java:26)
at main.Main.main(Main.java:29)
Итак, похоже, что в какой-то момент он проверяет пользователя и пароль. Он просто дает первую ошибку, если пользователь и пароль верны.
Итак, я провел поиск и несколько раз получил решение, указанное для этого вопроса (хотя часто в нем указывается «Использование пароля: Да» вместо «Нет»):
java. sql .SQLException: доступ запрещен для пользователя 'root' @ 'localhost' (с использованием пароля: YES)
В нем говорится, что я должен выполнить следующую инструкцию:
GRANT ALL PRIVILEGES ON *.* TO 'root'@'localhost' IDENTIFIED BY '%password%' WITH GRANT OPTION;
Проблема в том, что я не могу это запустить. Когда я пытаюсь запустить его в MySQL Workbench, я получаю следующую ошибку:
0 5 01:12:32 GRANT ALL PRIVILEGES ON *.* TO 'user'@'localhost' IDENTIFIED BY 'password' WITH GRANT OPTION Error Code: 1064. 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 'IDENTIFIED BY 'password' WITH GRANT OPTION' at line 1 0.000 sec
Кроме того, я попытался полностью удалить MySQL и переустановить его. Это не помогло.
Отказ от ответственности: Пароль и пользователь были изменены по соображениям конфиденциальности. Что касается ошибок, это не имеет значения, вызывая DriverManager со строкой подключения и классом свойств, который я пробовал. Извините за больше basi c и, возможно, плохой englisch. Я использую MySQL Server 8.0.20 Community с InnoDB Engine. J / Connector и MySQL Notifier относятся к одной и той же версии. Я установил все (включая рабочую среду) с помощью Windows установщика, загруженного с: https://dev.mysql.com/downloads/mysql/ Я использую Windows 10.
Когда я удаляю параметр serverTimezone, я получаю следующая ошибка:
java.sql.SQLException: The server time zone value 'Mitteleurop�ische Sommerzeit' is unrecognized or represents more than one time zone. You must configure either the server or JDBC driver (via the 'serverTimezone' configuration property) to use a more specifc time zone value if you want to utilize time zone support.
at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:129)
at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:97)
at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:89)
at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:63)
at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:73)
at com.mysql.cj.jdbc.exceptions.SQLExceptionsMapping.translateException(SQLExceptionsMapping.java:76)
at com.mysql.cj.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:836)
at com.mysql.cj.jdbc.ConnectionImpl.<init>(ConnectionImpl.java:456)
at com.mysql.cj.jdbc.ConnectionImpl.getInstance(ConnectionImpl.java:246)
at com.mysql.cj.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:197)
at java.sql.DriverManager.getConnection(DriverManager.java:664)
at java.sql.DriverManager.getConnection(DriverManager.java:208)
at main.data.SQLTransceiver.reconnect(SQLTransceiver.java:31)
at main.data.SQLTransceiver.<init>(SQLTransceiver.java:26)
at main.Main.main(Main.java:28)
Не знаю, поможет ли это, но возможно.
Заранее большое спасибо :)