MariaDB使用新建用户无法登录,提示密码字符编码相关错误
问题成因
- 该问题本质是密码编码不匹配导致的校验失败:MariaDB存储用户密码时会使用服务端指定的字符集对密码进行编码后计算哈希,客户端登录时也会用自身配置的字符集对输入的密码编码后传输,两边编码结果不一致就会触发校验失败,返回对应报错。
- Docker部署的MariaDB官方镜像默认未显式指定全局字符集,默认会使用
latin1作为服务端字符集,如果你创建新用户/设置密码时直接在容器内执行命令,密码会用latin1编码存储。 - DBeaver作为客户端默认使用UTF-8编码传输密码,两边编码规则不同,就会触发对应的报错提示。
解决方案
以下方案均不需要卸载重装数据库:
方案1:修改DBeaver连接配置(最快生效,无需修改数据库侧配置)
- 打开DBeaver中对应MariaDB连接的「编辑连接」页面
- 切换到「驱动属性」标签页
- 新增自定义属性:键为
passwordCharacterEncoding,值设置为latin1(如果确认服务端用的是其他字符集就填对应值,绝大多数Docker默认部署的场景填latin1即可) - 保存配置后重新测试连接即可正常登录。
方案2:统一MariaDB全局字符集(一劳永逸,避免后续新建用户再出现同类问题)
临时生效(容器重启后配置会还原)
- 进入MariaDB容器:
docker exec -it <你的MariaDB容器ID/容器名> bash - 登录MariaDB root账号:
mysql -u root -p,输入root密码后进入命令行 - 执行以下命令修改全局字符集配置:
SET character_set_server = utf8mb4; SET collation_server = utf8mb4_general_ci;
- 重新给异常的新用户设置密码,刷新权限即可:
ALTER USER '你的新用户名'@'%' IDENTIFIED BY '你的登录密码'; FLUSH PRIVILEGES;
永久生效
- 找到你启动MariaDB容器时挂载的
my.cnf配置文件,在[mysqld]节点下新增以下配置:
[mysqld]
character-set-server = utf8mb4
collation-server = utf8mb4_general_ci
- 保存配置文件后重启MariaDB容器:
docker restart <你的MariaDB容器ID/容器名> - 重新给新用户设置一次密码,刷新权限后即可正常登录。
内容的提问来源于stack exchange,提问作者aksarc
相关产品推荐
相关产品推荐

