兄弟们,laravel遇到个数据库1366插入报错。有大佬知道怎么解决吗

系统环境:Laravel 6 + PHP7.4 + Mysql5.7

  • 我在站内做了一个外链跳转的功能,需要记录跳转链接到数据库, 下面是业务代码:
    /**
    * @param $url
    * 生成间接跳转url
    */
    function goto_url($url)
    {
      return '/goto?u=' . base64_encode($url);
    }

    下面是路由

    Route::get('goto', function () {
    $url = mb_substr(base64_decode(request()->get('u'), true), 0, 255);
    $ua = mb_substr(request()->userAgent(), 0, 255);
    if ($url) {
    DB::table('out_links')->insert([
    'url' => $url,
    'ip' => request()->getClientIp(),
    'ua' => $ua,
    'created_at' => now(),
    'updated_at' => now(),
    ]);
    return redirect($url);
    }
    return redirect('/');
    });

    !!然后问题就来了,我在laravel storage/logs目录下,每天都会看到这样的报错信息:

![兄弟们,larave遇到个数据库插入报错。有大佬知道怎么解决吗]
兄弟们,laravel遇到个数据库1366插入报错。有大佬知道怎么解决吗

我通过查资料,网上大部分都是说数据库编码问题,可是我已经检查了mysql数据库、数据表、以及表字段都是utf8mb4_unicode_ci

所以说,有大佬知道这是什么原因吗

下面是数据库 show VARIABLES like 'char%' 执行结果

兄弟们,laravel遇到个数据库1366插入报错。有大佬知道怎么解决吗

《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
讨论数量: 24

show varialbes like 'char%' 执行看看呢?

2年前 评论
小李世界 (作者) 2年前
清风 (楼主) 2年前

utf8mb4_general_ci试试?
Laravel
而且你也可以查一下,为什么该字段是乱码,从根源解决一下

2年前 评论

是你base64解析出来的数据有问题吧。日志先把解析出来的数据保存一次具体看下啥情况

2年前 评论
清风 (楼主) 2年前
deatil (作者) 2年前

库、表、字段都是utf8mb4吗

执行insert之前set names utf8mb4看看

2年前 评论

我不知道什么原因,但是我可以教你如何排查,你增加打点日志。把url入参、base64_decode后的数据、mb_substr后的数据,都打印处理,应该就能分析个七七八八了

2年前 评论
清风 (楼主) 2年前

很经典的问题 file

2年前 评论
清风 (楼主) 2年前

手持两把锟斤拷,口中疾呼烫烫烫

2年前 评论
清风 (楼主) 2年前

base64_decode返回的可能是二进制

2年前 评论

就是编码的问题 或者说 前端给你传过来的就是这样 故意测下你的系统

2年前 评论

考虑不存原始url 存储 base64 之后的字符串 避免出现有问题的字符

2年前 评论

可能是 url 编码问题,你试下 urldecode($u) 再 base64_decode。感觉应该和数据库没关系。

最好是能把导致出错的那个记录原始信息找出来,看看他为啥这么与众不同。

遇到这种问题,你可以给加个 try catch, 插入失败的时候把原始信息记录到日志,这样方便找问题,如果拿到原始信息你自己要是还找不到原因,贴出来,大家才知道该从哪儿下手,不然大家就只能猜,你也得不到答案。

2年前 评论

你的 base64 转码大概包含了+ / 这类特殊字符而你没进行处理,接收的时候转义一下试试吧

2年前 评论

我改成直接存base64后的数据了。不往数据库存原始数据了。后台查看记录的时候,base64解码一道。再观查两天看看还没有这个问题。感谢各位大佬~

2年前 评论

问题已经解决了,应该是base64编码的问题,我换成url编码解码,就没出现过这个问题了

2年前 评论

你的数据库不支持特定的表情符号吧

2年前 评论

iconv('GB2312', 'UTF-8', base64_decode($url)); :confused:

2年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!