database_url必须写在.env文件中,以mysql://开头、用127.0.0.1而非localhost、正确设置serverversion、url编码特殊字符;pdo_mysql扩展须启用;数据库用户需有create权限;serverversion填错会导致迁移异常或字段丢失。

DATABASE_URL 必须写在 .env 里,不是 doctrine.yaml
Doctrine 连不上 MariaDB,90% 是因为把连接串写错了地方。Symfony 5.2 的数据库连接信息只认 .env 文件里的 DATABASE_URL,config/packages/doctrine.yaml 里没有 url 或 host 字段——它只管实体映射和缓存配置,不参与实际建连。
常见错误现象:Connection refused、SQLSTATE[HY000] [2002] No such file or directory、Access denied for user。这些都不是 Doctrine 配置问题,而是 DATABASE_URL 格式或权限没对上。
-
DATABASE_URL必须以mysql://开头(Doctrine 不识别mariadb://) - 用
127.0.0.1,别写localhost—— 否则 PHP 会尝试 Unix socket,而 MariaDB 默认监听 TCP -
serverVersion参数不能省:MariaDB 10.3 写10.3,10.5 写10.5;填错会导致 DQL 生成失败或索引语法报错 - 密码含
@、/、:等字符必须 URL 编码,比如pa@ss/word→pa%40ss%2Fword
pdo_mysql 扩展必须启用,否则直接报 Class not found
Symfony 启动时提示 Class 'PDO' not found 或 Driver "pdo_mysql" is not supported,说明 PHP 没装或没启 pdo_mysql 扩展。这不是 Symfony 配置问题,是底层依赖缺失。
检查方式很简单:php -m | grep pdo_mysql。没输出就说明没启用。
- Ubuntu/Debian:运行
sudo apt install php-mysql,然后重启 PHP-FPM 或 Apache - CentOS/RHEL:用
sudo yum install php-mysqlnd(注意是mysqlnd,不是mysql) - Docker 环境:Dockerfile 里加
RUN docker-php-ext-install pdo_mysql - Windows WAMP/XAMPP:打开 php.ini,取消注释
extension=php_pdo_mysql.dll
doctrine:database:create 报 Access denied?用户缺 CREATE 权限
php bin/console doctrine:database:create 不是用 root 登的,它用的就是 DATABASE_URL 里写的用户名。所以报 Access denied,基本等于“这个用户没建库权限”,不是密码错了。
典型场景:你用 db_user 连接,但只给了 SELECT/INSERT 权限,CREATE DATABASE 被拒。
- 登录 MariaDB(用 root 或高权限账号):
mysql -u root -p - 执行授权:
GRANT CREATE ON *.* TO 'db_user'@'%' IDENTIFIED BY 'your_password'; - 刷新权限:
FLUSH PRIVILEGES; - 如果只是本地开发,更简单做法是手动建库:
mysql -u root -p -e "CREATE DATABASE IF NOT EXISTS symfony_webapp CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;",再跑doctrine:schema:create
serverVersion 填错会导致迁移失败或字段丢失
MariaDB 和 MySQL 协议兼容,但语法细节不同。Doctrine 依赖 serverVersion 决定是否生成 JSON 类型、是否用 ALGORITHM=INPLACE、甚至是否支持 ENUM 默认值。填错版本号,轻则迁移卡住,重则删掉已有字段。
查当前 MariaDB 版本:mariadb --version 或连进库后执行 SELECT VERSION();。结果类似 10.11.8-MariaDB-1:10.11.8+maria~ubu2204,取前段 10.11 就行。
- MariaDB 10.3+:填
10.3、10.5、10.11—— 别简写成10 - 填
10.0却连着10.11实例:Doctrine 可能跳过JSON字段定义,导致make:entity生成的 migration 缺字段 - 填
8.0(MySQL 版本)连 MariaDB:某些 ALTER 操作会触发不兼容语法,报错Unknown column type "json"或ALGORITHM=INPLACE is not supported
MariaDB 版本号和 serverVersion 的匹配最容易被跳过,一但 mismatch,后续所有 migration 和 schema 操作都可能静默出错——看着成功,实际表结构不对。











