Docker 一键运行 MySQL 5.7/8.0 最省事,避免环境配置难题;需注意认证插件、端口映射、远程访问、客户端驱动版本及 utf8mb4 字符集统一设置。
对新手来说,装原生 MySQL 容易卡在服务启动、权限配置、编码乱码这些环节。Docker 是最省事的选择——不用改系统环境变量,不污染本地端口(默认只开 3306),镜像版本明确,删了重来也只要几秒。
实操建议:
docker 和 docker-compose(macOS / Windows 用户推荐用 Docker Desktop)docker run -d \ --name mysql8 \ -p 3306:3306 \ -e MYSQL_ROOT_PASSWORD=root123 \ -e MYSQL_DATABASE=testdb \ -e MYSQL_USER=dev \ -e MYSQL_PASSWORD=dev123 \ -v $(pwd)/mysql-data:/var/lib/mysql \ -d mysql:8.0
mysql:5.7 即可$(pwd)/mysql-data 是本地持久化路径,第一次运行后会自动生成;别漏掉这个 -v,否则容器重启数据就丢了执行 mysql -h 127.0.0.1 -P 3306 -u root -p 报错时,90% 出在这几个地方:
caching_sha2_password 插件认证,老客户端(比如某些 Python 的 mysql-connector 8.0.11 之前版本)不支持 → 改成 mysql_native_password:ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY 'root123';
-p 3306:3306 映射正确,且没被本机其他服务(如 MAMP、Homebrew MySQL)占着端口 → 查看占用:lsof -i :3306(macOS/Linux)或 netstat -ano | findstr :3306(Windows)localhost 连接 → 进容器执行:mysql -u root -proot123 -e "CREATE USER 'dev'@'%' IDENTIFIED BY 'dev123'; GRANT ALL ON *.* TO 'dev'@'%'; FLUSH PRIVILEGES;"
图形客户端比命令行友好,但新手常因驱动/SSL 设置栽跟头:
Use SSL → 设为 Require 或 Disable(本地学习建议关掉,避免证书报错)allowPublicKeyRetrieval=true(否则报 Public Key Retrieval is not allowed)Unknown system variable 'query_cache_size',说明用了 MySQL 8.0 驱动连 5.7 实例(或反过来)→ 在 DBeaver 的 Driver Settings → Edit Driver → 切换对应版本的 JAR(如 mysql-connector-java-8.0.33.jar 对应 8.0,mysql-connector-java-5.1.49.jar 对应 5.7)建库建表时指定了 CHARSET=utf8mb4,但插入中文还是乱码,问题大概率出在连接层——MySQL 的 utf8 实际是阉割版(最多 3 字节),真正支持 emoji 和生僻字的是 utf8mb4。
docker run ... -e MYSQL_INITDB_ARGS="--character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci" ...
mysql -u root -proot123 -e "SET NAMES utf8mb4;"
my.cnf 内容如下:[client] default-character-set = utf8mb4然后启[mysql] default-character-set = utf8mb4
[mysqld] character-set-server = utf8mb4 collation-server = utf8mb4_unicode_ci
动时加 -v $(pwd)/my.cnf:/etc/mysql/conf.d/my.cnf
字符集这事,服务端、连接层、客户端三者缺一不可,少设一处就白忙活。