MySQL 服务启动后连不上 localhost 是什么情况
多数人装完 MySQL,
mysql -u root -p命令能进,但用 Navicat、DBeaver 或 MySQL Workbench 连
localhost就报错 —— 典型是服务没监听 TCP 端口,或绑定了
127.0.0.1却被客户端解析成 IPv6 的
::1。
检查方法:
netstat -tuln | grep :3306如果只看到
127.0.0.1:3306,说明只接受 IPv4 回环;如果没输出,说明
skip-networking开着或
bind-address被设成了
127.0.0.1以外的值(比如
0.0.0.0但防火墙拦了)。 确认
my.cnf(Linux)或
my.ini(Windows)里没有
skip-networking = 1
bind-address推荐设为
127.0.0.1(仅本地)或
0.0.0.0(全网卡,注意防火墙) 改完重启服务:
sudo systemctl restart mysql(Linux)或服务管理器重启 MySQL 服务
Navicat 连接时提示 “Client does not support authentication protocol”
这是 MySQL 8.0+ 默认用
caching_sha2_password插件,而老版本 Navicat(v12 以前)、某些 Python 驱动(如 PyMySQL 0.9 以下)不支持。不是密码错了,是认证协议不兼容。
临时解决(开发环境可用):
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'your_password';然后
FLUSH PRIVILEGES;。 生产环境不建议降级认证方式,应升级客户端工具或驱动 若用 Docker 启 MySQL 8,加启动参数:
--default-authentication-plugin=mysql_native_password连接字符串里显式指定 auth plugin(如 JDBC:
?serverTimezone=UTC&allowPublicKeyRetrieval=true&useSSL=false)
DBeaver 连接 MySQL 8 报错 “Public Key Retrieval is not allowed”
本质是 MySQL 8 的安全策略变更:当服务端要求公钥交换(比如用
caching_sha2_password),客户端默认禁止自动获取公钥,防止中间人攻击。DBeaver 默认关掉了这个开关。
解决方法是在连接配置的 Driver Properties 里手动加两个参数:
allowPublicKeyRetrieval→ 设为
true
useSSL→ 设为
false(本地开发可关;生产必须开 SSL 或配证书)
注意:不能只改 URL,DBeaver 的 MySQL 驱动(MySQL Connector/J)必须 ≥ 8.0.15 才完整支持
caching_sha2_password;低于此版本即使加参数也无效。
客户端连上但查不到数据库或表名乱码
常见于 Windows 安装包默认字符集是
latin1,而建库时没指定
CHARACTER SET utf8mb4,导致客户端发 UTF-8 请求,服务端按 latin1 解,结果表名显示成问号或乱码符号。
验证当前连接字符集:
SHOW VARIABLES LIKE 'character_set%';<br>SHOW VARIABLES LIKE 'collation%';关键看
character_set_client、
character_set_connection、
character_set_database是否都是
utf8mb4。 永久修复:在
my.cnf的
[mysqld]段加:
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci客户端工具(如 Navicat)连接时,在高级设置里勾选「使用 MySQL 字符集」或手动填
utf8mb4已有库表乱码?
ALTER DATABASE db_name CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci;,再逐表
ALTER TABLE,但数据已损毁的需从备份恢复
字符集这事一旦漏掉初始化配置,后面补救成本远高于起步时多敲两行配置。
