Symfony 默认不原生支持 SQL Server,必须显式切换 Doctrine 数据库驱动为 sqlsrv 或 pdo_sqlsrv,否则即使 DATABASE_URL 正确也会报“Driver not supported”或连接超时;需确保 PHP 层已安装并启用 sqlsrv/pdo_sqlsrv 扩展,Linux/macOS 需手动编译安装,Windows 需检查 php.ini 启用且运行 php -m | grep sqlsrv 验证。

Symfony 默认不原生支持 SQL Server,必须显式切换 Doctrine 的数据库驱动为 sqlsrv 或 pdo_sqlsrv,否则哪怕 DATABASE_URL 写对了也会报 Driver "sqlsrv" not supported 或连接超时。
确认已安装并启用 SQL Server 驱动(PHP 层)
Doctrine 要连 SQL Server,底层依赖 PHP 的 sqlsrv 或 pdo_sqlsrv 扩展,不是装个 Composer 包就能跑的。
- Linux/macOS:必须手动编译安装
sqlsrv扩展(微软官方提供),pdo_sqlsrv通常不被推荐用于 Symfony + Doctrine 场景;Windows 下一般随 PHP 安装包自带,但需检查php.ini是否启用了extension=sqlsrv和extension=pdo_sqlsrv - 运行
php -m | grep sqlsrv确认扩展已加载;没输出就说明没装或没启用 - 若用 Docker,镜像必须基于微软官方 PHP-SQL Server 镜像(如
mcr.microsoft.com/mssql/server配套的 PHP 镜像),普通镜像默认不含该扩展</li> </ul> <H3><code>DATABASE_URL
格式必须用sqlsrv://协议头Symfony 5.4+ 强制从
.env读取DATABASE_URL,且 Doctrine 不识别sqlserver://、mssql://等别名 —— 只认sqlsrv://。- 正确写法:
DATABASE_URL="sqlsrv://sa:your_password@127.0.0.1:1433/your_db_name?charset=utf8" - 主机不能写
localhost(会尝试 Unix socket,SQL Server 不支持),必须用127.0.0.1或真实 IP - 端口默认是
1433,如果改过必须显式写上;?charset=utf8是必须参数,否则中文字段查出来是乱码 - 密码含
@、/、:等字符时,必须 URL 编码,例如Pass@123→Pass%40123
修改
config/packages/doctrine.yaml启用 SQL Server 兼容模式Doctrine 默认按 MySQL 行为生成 DDL,直接连 SQL Server 会卡在
doctrine:schema:create报语法错误(比如不支持ENGINE=InnoDB)。- 在
doctrine.dbal下加server_version: '2019'(对应 SQL Server 2019)或'2022';版本号错会导致CREATE TABLE语句生成失败 - 必须设置
driver: 'sqlsrv'(即使DATABASE_URL已指定协议,这里仍要显式声明,否则 Doctrine 会 fallback 到默认驱动) - 删掉或注释掉所有 MySQL 专属配置,如
default_table_options、charset(SQL Server 用collation控制)
doctrine:database:create在 SQL Server 下不可用这个命令本质是执行
CREATE DATABASESQL,但 SQL Server 要求连接用户有dbcreator角色权限,而 Doctrine 默认连接用户(如sa)常被限制或未授权。- 别指望
php bin/console doctrine:database:create成功 —— 直接连 SQL Server Management Studio 或sqlcmd手动建库:CREATE DATABASE your_db_name; - 建完库后,再运行
php bin/console doctrine:schema:create(注意不是update),它只建表,不碰库级操作 - 若要用迁移,先确保
doctrine/doctrine-migrations-bundle已安装,并生成初始迁移:php bin/console make:migration,再migrate
最常被跳过的点:SQL Server 的
datetime字段精度是 3.3ms,Doctrine 默认映射成datetime类型,但如果你实体里用了@ORM\Column(type="datetime"),插入时可能因精度截断报错;改成datetime2并在doctrine.yaml中配置types映射才稳妥。 - 正确写法:


















