java. sql .SQLException: доступ запрещен для пользователя '' @ 'localhost' (с использованием пароля: NO) - PullRequest
0 голосов
/ 30 мая 2020

Итак, я получаю сообщение об ошибке 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)

Не знаю, поможет ли это, но возможно.

Заранее большое спасибо :)

Ответы [ 2 ]

0 голосов
/ 31 мая 2020
• 1000 Server, Connector / J, Notifier и Workbench).

Хотя я не понимаю, как это могло вызвать такую ​​ошибку, или если бы это была ошибка, которую он исправил.

Спасибо за все, кто там старался помочь: D

0 голосов
/ 30 мая 2020

Используйте следующий URL-адрес подключения:

 String s = "jdbc:mysql://localhost:3306/databasename?user=user&password=password&useUnicode=true&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=UTC";

Надеюсь, это вам поможет, спасибо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...