Java.sql.SQLException: 用户'root'@'localhost'被拒绝访问(使用密码:是)

73
以下代码:
Class.forName("com.mysql.jdbc.Driver");
Connection m_connection = DriverManager.getConnection("jdbc:mysql://localhost","root","root");

getConnection() 上抛出此异常:

java.sql.SQLException: Access denied for user 'root'@'localhost' (using password: YES)
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1074)
    at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:4074)
    at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:4006)
    at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:919)
    at com.mysql.jdbc.MysqlIO.proceedHandshakeWithPluggableAuthentication(MysqlIO.java:1694)
    at com.mysql.jdbc.MysqlIO.doHandshake(MysqlIO.java:1244)
    at com.mysql.jdbc.ConnectionImpl.coreConnect(ConnectionImpl.java:2397)
    at com.mysql.jdbc.ConnectionImpl.connectOneTryOnly(ConnectionImpl.java:2430)
    at com.mysql.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:2215)
    at com.mysql.jdbc.ConnectionImpl.<init>(ConnectionImpl.java:813)
    at com.mysql.jdbc.JDBC4Connection.<init>(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:411)
    at com.mysql.jdbc.ConnectionImpl.getInstance(ConnectionImpl.java:399)
    at com.mysql.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:334)
    at java.sql.DriverManager.getConnection(Unknown Source)
    at java.sql.DriverManager.getConnection(Unknown Source)
    at db.Database.<init>(Database.java:91)
    at db.Main.main(Main.java:10)
这是什么原因造成的?我该如何解决?
编辑:
    public static void main(String[] args) throws ClassNotFoundException, ServletException, SQLException 
    {

        try
        {
            Connection conn = (Connection) DriverManager.getConnection("jdbc:mysql://localhost/?user=root&password=rootpassword"); 
            Statement   s = (Statement) conn.createStatement();
            int result = s.executeUpdate("CREATE DATABASE databasename");
        }


        catch ( Exception e)
        {
            e.printStackTrace();
        }
}

输出:

java.sql.SQLException: Access denied for user 'root'@'localhost' (using password: YES)
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1074)
    at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:4074)
    at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:4006)
    at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:919)
    at com.mysql.jdbc.MysqlIO.proceedHandshakeWithPluggableAuthentication(MysqlIO.java:1694)
    at com.mysql.jdbc.MysqlIO.doHandshake(MysqlIO.java:1244)
    at com.mysql.jdbc.ConnectionImpl.coreConnect(ConnectionImpl.java:2397)
    at com.mysql.jdbc.ConnectionImpl.connectOneTryOnly(ConnectionImpl.java:2430)
    at com.mysql.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:2215)
    at com.mysql.jdbc.ConnectionImpl.<init>(ConnectionImpl.java:813)
    at com.mysql.jdbc.JDBC4Connection.<init>(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:411)
    at com.mysql.jdbc.ConnectionImpl.getInstance(ConnectionImpl.java:399)
    at com.mysql.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:334)
    at java.sql.DriverManager.getConnection(Unknown Source)
    at java.sql.DriverManager.getConnection(Unknown Source)
    at db.Main.main(Main.java:19)

1
你能否使用 MySQL GUI 客户端(如 SqlYog 或 PhpMyAdmin)连接数据库? - Tomer
1
@ftom2:是的,我可以成功访问phpmyadmin - JAN
1
你确定提供的 用户名密码 是正确的吗?在我看来,似乎没有名为 root 的用户 :( 不太确定,但是难道你不需要像这样提供 数据库名称Connection con = DriverManager.getConnection("jdbc:mysql://localhost;database=mywebsitedb;user=sa;password=thatstrue;"); - nIcE cOw
@GagandeepBali:再想一想:如果登录错误,那么OP怎么能通过phpmyadmin访问它呢? - BalusC
@BalusC:实际上从未使用过 phpmyadmin,虽然有时会使用 SQLServer,但这些字段通常是默认自动填充的,而我们也会忘记它们。这就是为什么那个猜测只是作为评论出现的原因,否则如果我认为这确实是情况(可能是或不是),它可以成为一个回答。但由于您对该评论感到冒犯,如果我再问同样的问题,那我就非常错了,我的错 :-) - nIcE cOw
1
需要确定两件事情-您是否是有效用户,您是否具有执行操作的权限(特权)。权限采用指定主机上的特定特权形式。在引入任何Java之前可以回答这两个问题。个人而言,我会使用命令行连接到指定的用户作为我的sql,例如“mysql -uroot -prootpassword”,然后执行命令“create database mydb”。如果这起作用,您可以删除数据库并转到Java代码。 - Romski
33个回答

0

声明的顺序:

  • 驱动程序
  • 连接字符串
  • 用户名
  • 密码

如果我们按照以下顺序声明:

  • 连接字符串
  • 用户名
  • 密码
  • 驱动程序

应用程序将会失败。


0
由于以下原因,我为MySQL创建了新的用户名和密码,现在我能够成功连接。如果您的密码是编码格式,请创建新密码。

https://www.digitalocean.com/community/tutorials/how-to-create-a-new-user-and-grant-permissions-in-mysql#:~:text=There%20is%20a,mysql_native_password%20plugin%20instead%3A

某些版本的PHP存在已知问题,会导致caching_sha2_password出现问题。如果您计划使用此数据库与PHP应用程序(例如phpMyAdmin)一起使用,则可能希望创建一个用户,该用户将使用旧的但仍然安全的mysql_native_password插件进行身份验证:


0
有时候MySQL服务器在创建用户时,会将认证类型设置为非“Standard”类型。我使用的用户的认证类型被设置为“caching_sha_password”。因此,连接失败了。
我通过MySQL Workbench创建了一个新用户,并赋予了所有权限,并将认证类型设置为“Standard”,这样异常问题就解决了。

enter image description here


0
解决了!在你的Java代码中将localhost改为127.1.1.1,使用localhost会无法连接并抛出此异常。

0

我不得不更改我的SQL设置(在我的主机Dreamhost中),以允许用户名从其他主机访问数据库,而不仅仅是Dreamhost,因为我正在从计算机上的IDE运行程序。我现在通过将%添加到可允许主机列表中来实现这一点。现在它可以工作了!


我应该补充一下,这类似于#munchkins的方法,但是从SQL控制面板端开始。 - Chris Appleby

0

我也遇到了同样的问题,我的连接字符串是有效的,用户名和密码也是有效的,即使用户具有访问数据库的足够权限。

我通过删除MySQL创建的临时文件夹来解决了这个问题(在删除任何文件夹之前,请备份,以防万一它不起作用,您可以再次放置那些文件)。

Windows中MySQL的临时和连接文件的默认文件夹位置为:

C:\ProgramData\MySQL

我删除了以下文件夹(已备份):

C:\ProgramData\MySQL\MySQL Server \Data\sys

注意:在删除任何项目之前,请确保MySQL服务未启动,否则它将不允许删除任何文件。

这对我很有效。


0
对我来说,解决方案是将URL格式更改为: con = DriverManager.getConnection(“jdbc:mysql:// localhost / w3schools?user = ###&password = ###”); 确保将适当的JAR添加到类路径并使用驱动程序 Class.forName(“com.mysql.jdbc.Driver”);

0

这个对我解决了问题。

ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY 'password';

GRANT ALL PRIVILEGES ON *.cfe TO 'root'@'%' IDENTIFIED BY 'password';

FLUSH PRIVILEGES;

-1
如果你正在使用Java连接本地计算机上的远程MySQL服务器,请按照以下步骤操作。 错误信息: “java.sql.SQLException: Access denied for user 'xxxxx'@'101.123.163.141' (using password: YES)”
对于远程访问,可能是cpanel或其他授予本地IP地址的远程访问权限。
在上面的错误信息中,“101.123.163.141”是我的本地计算机IP地址。因此,我们首先需要在Cpanel -> Remote MySQL®中给出远程访问权限,然后运行应用程序进行连接。
Class.forName("com.mysql.jdbc.Driver");  
Connection con=DriverManager.getConnection(  
    "jdbc:mysql://www.xyz.com/abc","def","ghi");  
//here abc is database name, def is username and ghi        
Statement stmt=con.createStatement();  
ResultSet rs=stmt.executeQuery("select * from employee");  
    while(rs.next())  
        System.out.println(rs.getInt(1)+" "+rs.getString(2)+"  
                          "+rs.getString(3));  
con.close();    

希望这能解决你的问题。
谢谢。

-1
如果您正在使用MySQL Workbench,请转到Workbench的主页,右键单击您的数据库,复制JDBC连接字符串,然后将其粘贴到Java程序中。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接