phpenv中pdo_mysql默认可用,无需编译;启用后需确认php.ini中extension=pdo_mysql未被注释,并在dsn中显式指定charset=utf8mb4及设置pdo::attr_emulate_prepares=>false。

phpEnv 里 PDO_MYSQL 扩展默认就可用,不用手动编译
phpEnv 是 Windows 下的集成环境,PHP 和 MySQL 都预编译打包好了。它默认已启用 pdo 和 pdo_mysql,只要没被你手动注释掉,就无需运行 phpize、configure 或 pecl install ——那些是 Linux 源码编译场景才用的。
检查方法很简单:打开 phpEnv 界面 → 点击「PHP 设置」→ 查看「扩展列表」,确认 pdo 和 pdo_mysql 前面的勾是亮的。如果没勾上,点一下启用,phpEnv 会自动修改对应 PHP 版本的 php.ini 并重启 Apache/Nginx。
常见误区:
• 不要去找 php_pdo_mysql.dll 手动复制到 ext/ 目录
• 不要改 extension_dir 路径——phpEnv 已设好,改错会导致扩展加载失败
• 不需要在 php.ini 里写 extension=php_pdo_mysql.dll,phpEnv 管理的是 extension=pdo_mysql(不带 php_ 前缀)
连接 MySQL 时 charset=utf8mb4 必须显式指定
phpEnv 自带的 MySQL 通常是 5.7 或 8.0,默认字符集是 utf8mb4,但 PDO 的 DSN 不会自动继承这个设置。如果只写 mysql:host=localhost;dbname=test,PDO 会用服务器旧版默认值(可能是 latin1 或 utf8),导致中文乱码或 emoji 插入失败。
正确写法必须包含 charset=utf8mb4:
$dsn = "mysql:host=localhost;dbname=test;charset=utf8mb4";
$pdo = new PDO($dsn, $user, $pass, [
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
]);
注意:
• utf8 在 MySQL 里实际是 utf8mb3,不支持 4 字节 Unicode(如 ?、?)
• utf8mb4 才是完整 UTF-8 实现
• 不要依赖 SET NAMES utf8mb4 替代 DSN 中的 charset,PDO 初始化阶段就该定死
phpEnv 启动后连不上 MySQL:先查服务状态和端口
phpEnv 界面显示「MySQL 已启动」,不代表 MySQL 进程真在监听。常见现象是 PHP 报错:PDOException: SQLSTATE[HY000] [2002] Connection refused 或 Can't connect to MySQL server on 'localhost'。
排查顺序如下:
• 打开 phpEnv → 「服务管理」→ 确认 MySQL 行状态是「运行中」,不是「暂停」或「未启动」
• 点击 MySQL 行右侧「配置」→ 查看 my.ini 中 port 值(默认 3306,但有时被改成 3307 或其他)
• 在 DSN 中显式加上端口:mysql:host=localhost;port=3307;dbname=test;charset=utf8mb4
• 如果用 127.0.0.1 替代 localhost,能绕过 Windows 下的命名管道问题(尤其 MySQL 8.0+)
补充:phpEnv 的 MySQL root 密码默认为空,但部分新版安装包会设为 root,首次连接失败时可尝试这两个值。
pdo_mysql 加载成功但 query() 报错:检查 ATTR_EMULATE_PREPARES
扩展加载了,new PDO() 也不报错,但一执行 $pdo->query("SELECT ...") 就崩,错误信息类似:SQLSTATE[HY000]: General error: 2014 Cannot execute queries while other unbuffered queries are active。
这通常是因为 MySQLi 或旧版 PDO 驱动残留行为干扰,解决办法是在 PDO 构造参数中强制关闭模拟预处理:
$pdo = new PDO($dsn, $user, $pass, [
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
PDO::ATTR_EMULATE_PREPARES => false,
]);
原因:
• PDO::ATTR_EMULATE_PREPARES => true(默认值)会让 PDO 在客户端拼接 SQL,容易触发 MySQL 的 unbuffered query 限制
• 设为 false 后,PDO 使用真正的服务器端预处理,更安全也更稳定
• phpEnv 的 PHP 版本(如 8.2+)和 MySQL(如 8.0+)完全支持此设置,无需降级兼容
这个开关不起眼,但它是 phpEnv 环境下 PDO 表现不一致的最常见根源——很多人卡在这一步,反复重装扩展,其实只需加一行配置。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











