mysql 8.0 默认认证插件 caching_sha2_password 与老 doctrine 不兼容,需先查用户 plugin 值,再执行 alter user 'user'@'%' identified with mysql_native_password by 'pwd' 并 flush privileges;同时 database_url 必须含 ?serverversion=8.0 且密码特殊字符需 url 编码。

MySQL 8.0 默认认证插件不兼容老 Doctrine 配置
Doctrine 默认用 mysql_native_password 插件鉴权,但 MySQL 8.0 新建用户默认用 caching_sha2_password,导致连接时直接报 Access denied for user 或 Authentication plugin 'caching_sha2_password' cannot be loaded。
- 检查当前用户认证方式:
SELECT host, user, plugin FROM mysql.user WHERE user = 'your_user'; - 强制改回兼容插件:
ALTER USER 'your_user'@'%' IDENTIFIED WITH mysql_native_password BY 'your_password'; - 如果必须用
caching_sha2_password(如安全合规要求),需在DATABASE_URL后加&ssl_mode=DISABLED,且确保 PHP 的mysqli或PDO扩展已启用sha256_password支持
DATABASE_URL 必须显式声明 serverVersion=8.0
Doctrine 不会自动探测 MySQL 版本,serverVersion 缺失会导致 DDL 生成错误(比如误用 JSON 类型语法或忽略 utf8mb4_0900_as_cs 排序规则),甚至迁移失败。
-
DATABASE_URL格式必须为:mysql://user:pass@127.0.0.1:3306/dbname?serverVersion=8.0 - 别写成
server_version=8.0或漏掉?—— Doctrine 只认serverVersion这个键名 - 若用 Docker MySQL 8.0 镜像,注意镜像标签是否真为 8.0(如
mysql:8.0.33),mysql:8可能滚动更新到 8.1+,而 Doctrine 尚未完全适配 8.1 的新保留字
本地开发别用 localhost,改用 127.0.0.1
PHP 的 PDO/MySQLi 在连接 localhost 时会尝试走 Unix socket,但容器内或某些 macOS M1 环境下 socket 路径不对,直接报 SQLSTATE[HY000] [2002] No such file or directory。
- 始终用
127.0.0.1替代localhost,强制走 TCP/IP - 若确需 socket(如性能敏感场景),得显式指定
unix_socket=/var/run/mysqld/mysqld.sock,并在DATABASE_URL中写成:mysql://user:pass@localhost:3306/dbname?unix_socket=/var/run/mysqld/mysqld.sock&serverVersion=8.0 - Docker Compose 中 MySQL 服务暴露的端口必须映射正确(如
3306:3306),否则127.0.0.1:3306在宿主机连不到容器内服务
密码含特殊字符必须 URL 编码
@、/、:、? 出现在密码里会破坏 DATABASE_URL 解析结构,导致 Doctrine 连到错误的 host 或 port,现象是 Connection refused 或连上空库。
- 常见错误写法:
mysql://user:pass@word@127.0.0.1/db→ 实际解析 host 为word@127.0.0.1 - 正确编码:
pass@word→pass%40word,pa/ss→pa%2Fss - 可用 PHP 命令快速验证:
php -r "echo rawurlencode('your@pass/word');"











