php 8.3数据库连接需显式配置charset=utf8mb4、启用mysqli/pdo_mysql扩展、改用mysql_native_password认证,并设置pdo::errmode_exception。

PHP 8.0 和 PHP 8.3 在接口配置层面没有语法或协议层的不兼容,但实际部署中常因环境配置、扩展行为、默认策略收紧而出现“连不上、存不了、报错多”等典型问题。这些问题不是代码写法变了,而是旧配置在新版本下被更严格地执行或显式拒绝。
数据库连接配置必须显式指定 charset=utf8mb4
PHP 8.0 已要求 DSN 中带 charset=utf8mb4,但部分项目靠 SET NAMES 补救还能勉强跑;PHP 8.3 完全不认这种补救——PDO 的字符集只在 DSN 解析时生效,$pdo->exec("SET NAMES utf8mb4") 或 setAttribute() 全部无效。
- 错误写法:
mysql:host=localhost;dbname=test→ 中文插入失败、乱码、SQLSTATE[HY000] 报错 - 正确写法:
mysql:host=127.0.0.1;dbname=test;charset=utf8mb4 - 额外注意:
localhost在 Linux 下默认走 socket,若 MySQL 只监听 TCP,换成127.0.0.1常立即解决连接拒绝
mysqli 和 pdo_mysql 扩展不再默认启用
PHP 8.0 还保留部分内置扩展痕迹,8.3 彻底剥离:mysqli 和 pdo_mysql 是独立扩展,必须手动启用,否则直接报
-
Fatal error: Uncaught Error: Class "PDO" not found(其实是扩展没加载) -
PDOException: could not find driver(不是 DSN 写错,是驱动缺失)
验证方式:运行phpinfo(),搜索PDO drivers => mysql和mysqli是否都显示 enabled
操作步骤: - 找到真实生效的
php.ini(用php --ini确认路径) - 取消注释这两行:
extension=mysqli extension=pdo_mysql
- Windows 下对应
php_mysqli.dll/php_pdo_mysql.dll,Linux 下是mysqli.so/pdo_mysql.so - 改完必须重启 PHP-FPM 或 Web 服务,只改配置不重启 = 白改
MySQL 8.0+ 用户认证插件不兼容
PHP 8.0 默认支持 mysql_native_password,但对 caching_sha2_password(MySQL 8.0 默认)支持有限;PHP 8.3 更严格,默认完全不识别该插件,除非编译时启用 OpenSSL 且配置正确。
- 表现:
Authentication plugin 'caching_sha2_password' cannot be loaded - 解决方案(推荐):登录 MySQL,为 PHP 连接用户重设认证方式
ALTER USER 'your_user'@'%' IDENTIFIED WITH mysql_native_password BY 'your_pass'; FLUSH PRIVILEGES;
- 不建议强行改 MySQL 全局配置,会影响其他客户端
错误处理模式需显式设置
PHP 8.0 开始 PDO::ATTR_ERRMODE 默认仍是 PDO::ERRMODE_SILENT,容易掩盖问题;PHP 8.3 虽未强制变更,但强烈建议设为异常模式,否则 SQL 错误静默失败,调试极难:
$options = [
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
];
$pdo = new PDO($dsn, $user, $pass, $options);
漏设会导致 execute() 失败却无提示,只返回 false,业务逻辑可能继续往下跑出错
不复杂但容易忽略
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











