最省事干净的本地mysql开发方式是用docker运行隔离容器。5.7用mysql:5.7镜像;8.0需加mysql_default_authentication_plugin=mysql_native_password并配置jdbc参数allowpublickeyretrieval=true。

用 Docker 一键拉起 MySQL 5.7 或 8.0 实例
本地开发最省事、最干净的方式就是跳过手动编译或安装包,直接用 Docker 运行一个隔离的 MySQL 容器。官方镜像更新及时、配置可控,且避免污染系统环境。
- 运行 MySQL 5.7(兼容老项目):
docker run -d --name mysql-dev -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 -v /path/to/my.cnf:/etc/mysql/my.cnf -v /path/to/data:/var/lib/mysql -d mysql:5.7 - 运行 MySQL 8.0(注意默认认证插件变化):
docker run -d --name mysql-dev8 -p 3307:3306 -e MYSQL_ROOT_PASSWORD=123456 -e MYSQL_DEFAULT_AUTHENTICATION_PLUGIN=mysql_native_password -d mysql:8.0 -
MYSQL_DEFAULT_AUTHENTICATION_PLUGIN=mysql_native_password是关键——否则客户端(如 navicat、旧版 JDBC 驱动)会报Authentication plugin 'caching_sha2_password' cannot be loaded - 挂载
/etc/mysql/my.cnf可自定义max_allowed_packet、sql_mode等;不挂载则用镜像默认配置
MySQL 8.0 连接失败时优先检查三项配置
连得上但认证失败、或连不上但端口看似通,大概率不是网络问题,而是服务端配置或客户端驱动不匹配。
- 确认容器内 MySQL 实际监听地址:进容器执行
mysql -uroot -p123456 -e "select @@bind_address;",返回*或0.0.0.0才表示接受外部连接 - 检查用户 host 权限:MySQL 8 默认创建的
root@localhost不允许远程登录,需手动执行:CREATE USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY '123456'; GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' WITH GRANT OPTION; FLUSH PRIVILEGES; - JDBC URL 要显式指定时区和认证插件:
jdbc:mysql://127.0.0.1:3306/test?serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true&useSSL=false,缺allowPublicKeyRetrieval=true在 8.0.14+ 会拒绝连接
本地开发用 my.cnf 的最小必要配置项
不需要照搬生产配置,但几个关键项不设好,写 SQL 时容易踩坑(比如插入中文变 ?、批量导入失败、GROUP BY 报错)。
-
[client]段加default-character-set = utf8mb4,保证命令行客户端默认用正确编码 -
[mysqld]段必须设:character-set-server = utf8mb4<br>collation-server = utf8mb4_unicode_ci<br>init_connect='SET NAMES utf8mb4'<br>skip-character-set-client-handshake = true -
sql_mode建议设为宽松模式:sql_mode = STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION,去掉ONLY_FULL_GROUP_BY避免开发期 GROUP BY 报错 - 修改后重启容器:
docker restart mysql-dev,别忘了加-v挂载配置文件,否则改了也不生效
验证连接与权限的三步快速检查法
别一上来就跑 ORM 或写业务代码,先用最原始方式确认底层链路通不通、权限对不对。
- 第一步:用
mysql -h127.0.0.1 -P3306 -uroot -p123456登录,能进就说明网络 + 认证 OK - 第二步:在 MySQL 内执行
SHOW VARIABLES LIKE 'character_set%';和SHOW VARIABLES LIKE 'collation%';,所有值都应含utf8mb4 - 第三步:建个测试表插入中文:
CREATE TABLE t1(id INT, name VARCHAR(10)) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;<br>INSERT INTO t1 VALUES (1, '张三');<br>SELECT * FROM t1;若显示乱码或报错,说明 client/server/conn 三端编码没对齐
Docker 容器生命周期短、配置易复现,但很多人忽略 my.cnf 挂载路径权限、MySQL 8 的默认认证插件、以及客户端连接参数的强制要求——这三个点卡住的时间,往往比搭环境本身还长。