Laravel 8插入JSON数据时出现UTF-8编码错误求助
问题原因及解决办法
问题原因
- 自定义Setter与Laravel内置Cast冲突:你同时使用了
array类型的cast和手动编写的setEventDataAttribute方法,Laravel的arraycast本身会自动完成数组到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
相关产品推荐
相关产品推荐

