JDBC连接MySQL报错及授权SQL语法错误求助
解决JDBC连接MySQL的认证协议错误及GRANT语句语法问题
我来帮你搞定这两个问题,本质都是MySQL 8.0+版本的新特性和旧操作逻辑不兼容导致的:
一、解决JDBC连接的Client does not support authentication protocol错误
这个报错的核心原因是:MySQL 8.0及以上默认使用caching_sha2_password认证插件,但你用的是旧版mysql-connector-java驱动(比如5.x系列),它不支持这个新的认证方式。有两种解决思路:
方案1:升级JDBC驱动(推荐)
- 把你的
mysql-connector-java依赖升级到8.0+版本,比如最新的8.0.33。 - 同时修改代码里的驱动类:从
com.mysql.jdbc.Driver改成com.mysql.cj.jdbc.Driver。 - JDBC URL也要调整,加上时区参数,示例:
String url = "jdbc:mysql://localhost:3306/your_db_name?serverTimezone=UTC&useSSL=false";
方案2:修改MySQL用户的认证方式(不升级驱动时用)
如果暂时不想升级驱动,可以把root用户的认证方式改回旧的mysql_native_password:
- 登录MySQL:
mysql -u root -p - 执行以下SQL:
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'mypassword'; FLUSH PRIVILEGES;
这样旧驱动就能正常连接了。
二、解决GRANT和UPDATE语句的语法错误
你遇到的ERROR 1064是因为MySQL 8.0对用户管理的语法做了严格调整:
关于GRANT语句的问题
MySQL 8.0里,GRANT命令不再支持直接在后面加IDENTIFIED BY来设置密码,必须拆分操作:
- 先设置用户密码(用户已存在用
ALTER USER,不存在用CREATE USER):ALTER USER 'root'@'localhost' IDENTIFIED BY 'mypassword'; - 再执行授权:
GRANT ALL PRIVILEGES ON *.* TO 'root'@'localhost'; FLUSH PRIVILEGES;
关于UPDATE语句的问题
MySQL 8.0已经移除了password()函数,所以你原来的UPDATE user SET authentication_string=password('mypassword')...会报错。正确的做法是用ALTER USER来设置密码(上面已经提到),如果一定要用UPDATE,需要直接传入加密后的密码,但这种方式不推荐——不同版本的加密规则可能有变化,ALTER USER是官方认可的标准操作方式。
内容的提问来源于stack exchange,提问作者sachin sarangamath
相关产品推荐
相关产品推荐

