You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PHP 7.4.14更新后出现MySQL语法及字符集错误求助

问题分析与修复方案

嘿,我遇过类似的PHP版本升级导致的MySQL连接问题,结合你给出的错误信息和环境,这绝对是PHP 7.4.14中mysqlnd驱动的会话初始化逻辑变更搞的鬼——这个版本的驱动会自动向MySQL发送一些配置语句,但这些语句要么语法错误,要么和你的MySQL 5.7.32环境不兼容,而PHP 7.3分支还没引入这个变更,所以7.3.26运行正常。

先逐个拆解错误原因:

  • 错误码1064(SET collation-server = utf8mb4_unicode_ci):collation-server是MySQL的全局配置参数,只能通过SET GLOBAL(需要超级权限)或者修改my.cnf/my.ini来调整,用普通SET语句改会话级参数本身就是语法错误,PHP驱动在这里犯了低级错误。
  • 错误码1115(未知字符集utf8mb4_unicode_ci):utf8mb4_unicode_ci是排序规则(collation),不是字符集(character set)!正确的会话字符集设置应该是SET character_set_connection = utf8mb4,排序规则要单独用SET collation_connection = utf8mb4_unicode_ci设置,驱动在这里把两者搞混了。
  • 错误码1064(sql_mode语句截断):看错误提示里的NO_ENGINE_SUBSTITUT少了末尾的ION,这明显是驱动拼接sql_mode字符串时的bug,而且就算字符串完整,驱动自动发送的语句格式也可能和你的MySQL环境不兼容。

下面是几个按优先级排序的修复方案,你可以根据自己的环境选择:

1. 临时回退PHP 7.4到7.4.13

这是最快的解决办法,如果7.4.14的安全补丁对你来说不是必须的(可以查下PHP官方的版本更新日志确认),直接回退到之前的版本,所有功能就能立刻恢复正常。

2. 禁用PHP自动初始化MySQL会话参数

这个方案不需要回退版本,只要修改PHP配置或者代码,阻止驱动自动发送错误的配置语句:

方法A:修改php.ini配置

找到你的php.ini文件,添加或修改以下配置:

; 禁用自动初始化会话参数
mysqli.auto_init = Off
; 可选:关闭一些可能干扰的统计功能
mysqlnd.collect_statistics = Off
mysqlnd.collect_memory_statistics = Off

修改后重启PHP-FPM或者你的Web服务器(比如Nginx/Apache)。

方法B:在代码中手动配置

如果无法修改服务器的php.ini,可以在建立数据库连接时覆盖自动初始化命令:

  • 如果你用的是mysqli:
$dbconn = new mysqli($host, $user, $password, $dbname);
// 清空自动初始化命令
$dbconn->options(MYSQLI_OPT_INIT_COMMAND, '');
  • 如果你用的是PDO:
$dsn = "mysql:host=$host;dbname=$dbname;charset=utf8mb4";
$options = [
    PDO::MYSQL_ATTR_INIT_COMMAND => '' // 禁用自动初始化
];
$dbconn = new PDO($dsn, $user, $password, $options);

3. 手动执行正确的会话配置语句

如果必须保留PHP 7.4.14,可以在建立连接后手动执行正确的配置语句,覆盖驱动的错误设置:

// 正确设置字符集和排序规则
$dbconn->query("SET character_set_connection = utf8mb4");
$dbconn->query("SET collation_connection = utf8mb4_unicode_ci");
// 正确设置sql_mode(用单引号避免解析问题)
$dbconn->query("SET SESSION sql_mode = 'NO_BACKSLASH_ESCAPES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION'");

4. 升级MySQL版本(可选)

你的MySQL 5.7.32本身是支持这些参数的,但升级到5.7的最新小版本或者MySQL 8.0,可能会更好地适配PHP新驱动的行为,但这个方案成本较高,建议优先尝试前面的方法。

验证步骤

修改完成后,重新运行你的脚本,检查是否还出现那三个错误码。如果是代码修改,建议先在测试环境验证没问题后再部署到生产环境。

内容的提问来源于stack exchange,提问作者step

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.29 04:03:12