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

从MySQL 5升级到MySQL 8时出现字符串值错误问题求助

解决MySQL 8插入含重音字符报错的问题

核心原因

你遇到的错误是因为PHP与MySQL的连接字符集未正确设置为utf8mb4。报错里的\xE1是字符á的ISO-8859-1(Latin1)编码,而MySQL的utf8mb4字段需要接收UTF-8编码的字符(á的UTF-8编码是\xC3\xA1)。phpMyAdmin能成功插入是因为它默认会把连接字符集设为utf8mb4,而你的PHP脚本没做这个设置。

解决方案

1. 显式设置MySQL连接字符集

在建立数据库连接后,立即执行以下代码:

mysqli_set_charset($conn, 'utf8mb4');

或者在连接时直接指定字符集(推荐):

$conn = mysqli_connect('localhost', 'username', 'password', 'database_name', 3306);
mysqli_set_charset($conn, 'utf8mb4');

2. 替换拼接SQL为预处理语句(必做,同时解决注入风险)

你当前的代码直接拼接用户输入到SQL中,存在严重的SQL注入风险,同时也是字符编码问题的潜在诱因。改用预处理语句:

// 准备预处理语句
$stmt = mysqli_prepare($conn, "INSERT INTO loginlog (usr, pwd, ip, tme) VALUES (?, ?, ?, ?)");
// 绑定参数:s表示字符串类型,四个参数对应四个占位符
mysqli_stmt_bind_param($stmt, 'ssss', $login1, $password1, MyRealIpAddr(), date("Y-m-d H:i:s"));
// 执行语句
mysqli_stmt_execute($stmt);
// 关闭语句
mysqli_stmt_close($stmt);

预处理语句会自动处理字符编码转换,同时彻底避免SQL注入。

3. 验证PHP脚本编码

确保你的PHP脚本确实是UTF-8无BOM编码(你已经做了这一步,可再确认下编辑器的保存设置),避免脚本本身的编码导致字符输出异常。

额外检查

  • 确认MySQL配置文件(my.cnf/my.ini)中以下参数设置正确,重启MySQL服务生效:
    [mysqld]
    character-set-server=utf8mb4
    collation-server=utf8mb4_general_ci
    
    这是全局兜底设置,你已经配置了数据库和表的排序规则,此步骤可作为补充验证。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 21:22:33