JDBC连接MySQL报Access denied,根源为项目UTF-16编码问题
关于MySQL Access Denied错误的排查与解决
先给你梳理下这个问题的来龙去脉和最终解决办法——你遇到的这个Access denied错误确实很棘手,毕竟同个账号在Maven项目和Hibernate里都能正常用,偏偏普通Java项目连不上。
你已经做过的有效排查
你已经排除了很多常见问题:
- 数据库URL、账号密码、权限都没问题(已有项目验证过)
- 复制了Maven项目的驱动包,甚至更换了不同版本的mysql-connector(包括5.1.8),错误依旧
- 查询
mysql.user表确认了root@localhost用户存在:
+---------+-----------+ | user | host | +---------+-----------+ | newuser | localhost | | root | localhost | +---------+-----------+
最终发现的隐蔽原因
这个问题的根源藏在项目编码设置里:
- 你的普通Java项目默认编码是UTF-16,而非常规的UTF-8
- 代码中写的密码是以UTF-16编码存储的,实际传输给MySQL的字节值和你看到的明文不一致
- MySQL收到错误的密码,自然返回了
Access denied验证失败
解决方法
只需把项目及文件编码统一改成UTF-8即可:
- 修改项目的全局编码设置为UTF-8
- 确认代码文件的编码也设置为UTF-8
- 重新确认代码中的密码内容,确保存储的是正确的UTF-8编码值
这样调整后,应用发送的密码就能和MySQL端存储的一致,连接问题就解决了。
内容的提问来源于stack exchange,提问作者mameo
相关产品推荐
相关产品推荐

