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

Laravel 8插入JSON数据时出现UTF-8编码错误求助

问题原因及解决办法

问题原因

  • 自定义Setter与Laravel内置Cast冲突:你同时使用了array类型的cast和手动编写的setEventDataAttribute方法,Laravel的array cast本身会自动完成数组到JSON字符串的编码/解码,手动setter会干扰这个流程,可能导致重复编码或字符处理异常。
  • 数组中存在隐藏的非UTF-8字符:虽然表面上数组里的字符串都是纯英文,但可能包含不可见的特殊字符(如全角空格、不可打印ASCII字符),这些字符能通过json_encode但会触发Laravel数据库层的UTF-8校验。
  • ISO8601日期格式无问题:该格式的字符串是标准UTF-8编码,不会导致此错误,可以排除这个因素。

解决办法

1. 移除自定义Setter(推荐)

Laravel的array cast已经完全覆盖了数组与JSON的转换逻辑,不需要手动编写setter。仅保留模型中的cast配置即可:

protected $casts = [
    'event_data' => 'array',
];

之后直接给event_data赋值数组,Laravel会自动处理编码存入数据库。

2. 净化数组中的非UTF-8字符(若需保留自定义Setter)

如果必须保留自定义setter,或者确认数组中存在隐藏特殊字符,可以递归过滤所有字符串字段,强制转为UTF-8:

protected $casts = [
    'event_data' => 'array',
];

public function setEventDataAttribute($value) {
    $cleanedData = $this->normalizeUtf8($value);
    $this->attributes['event_data'] = json_encode($cleanedData);
}

/**
 * 递归净化数据中的非UTF-8字符
 */
private function normalizeUtf8($data) {
    if (is_string($data)) {
        // 强制转换为UTF-8,自动丢弃无效字符
        return mb_convert_encoding($data, 'UTF-8', 'UTF-8');
    } elseif (is_array($data)) {
        return array_map([$this, 'normalizeUtf8'], $data);
    }
    return $data;
}

3. 检查数据库连接编码

确保config/database.php中MariaDB的连接配置使用兼容的UTF-8编码:

'connections' => [
    'mysql' => [
        // ...其他配置
        'charset' => 'utf8mb4',
        'collation' => 'utf8mb4_unicode_ci',
    ],
],

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 17:36:10