从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
相关产品推荐
相关产品推荐

