PHP脚本跨utf8mb4不同排序规则表插入特殊字符报错求助
解决MySQL 8.0插入特殊字符报“Incorrect string value”的问题
核心问题原因
MySQL 8.0对字符集的校验比5.6严格很多,即使源表和目标表都是utf8mb4系列排序规则,连接字符集不匹配或者sql_mode严格限制都会导致特殊字符插入失败。
解决方案
1. 强制设置数据库连接字符集为utf8mb4
这是最关键的一步,PHP连接数据库时必须显式指定utf8mb4,不能依赖默认配置:
- mysqli示例:
$conn = mysqli_connect('你的主机', '用户名', '密码', '数据库名'); // 必须在连接后立即设置字符集 mysqli_set_charset($conn, 'utf8mb4');
- PDO示例:
$dsn = 'mysql:host=你的主机;dbname=数据库名;charset=utf8mb4'; // DSN里直接指定字符集 $pdo = new PDO($dsn, '用户名', '密码', [PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION]);
2. 确认目标表字段的字符集类型
检查目标表的字段是否真的是utf8mb4类型(不是utf8),执行SQL查看:
SHOW FULL COLUMNS FROM target_table;
如果字段字符集是utf8,需要修改为utf8mb4:
ALTER TABLE target_table MODIFY COLUMN 字段名 VARCHAR(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
3. 检查并调整sql_mode(可选,不推荐长期使用)
MySQL 8.0默认开启STRICT_TRANS_TABLES等严格模式,会直接报错而非自动修正数据。可以临时关闭严格模式测试:
SET sql_mode = 'NO_ENGINE_SUBSTITUTION';
但更推荐从数据编码本身解决问题,而非放宽校验规则。
4. 停止使用mb_convert_encoding
源和目标都是utf8mb4编码,转码反而会破坏原有字符的正确编码,直接传递原始数据即可。
内容的提问来源于stack exchange,提问作者Daniele
相关产品推荐
相关产品推荐

