兄弟们,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遇到个数据库插入报错。有大佬知道怎么解决吗]
我通过查资料,网上大部分都是说数据库编码问题,可是我已经检查了mysql数据库、数据表、以及表字段都是utf8mb4_unicode_ci。
所以说,有大佬知道这是什么原因吗
下面是数据库
show VARIABLES like 'char%'执行结果

关于 LearnKu
show varialbes like 'char%'执行看看呢?utf8mb4_general_ci试试?而且你也可以查一下,为什么该字段是乱码,从根源解决一下
是你base64解析出来的数据有问题吧。日志先把解析出来的数据保存一次具体看下啥情况
库、表、字段都是utf8mb4吗
执行insert之前set names utf8mb4看看
插入乱码报错了
我不知道什么原因,但是我可以教你如何排查,你增加打点日志。把url入参、base64_decode后的数据、mb_substr后的数据,都打印处理,应该就能分析个七七八八了
很经典的问题
手持两把锟斤拷,口中疾呼烫烫烫
base64_decode返回的可能是二进制
就是编码的问题 或者说 前端给你传过来的就是这样 故意测下你的系统
考虑不存原始url 存储 base64 之后的字符串 避免出现有问题的字符
可能是 url 编码问题,你试下 urldecode($u) 再 base64_decode。感觉应该和数据库没关系。
最好是能把导致出错的那个记录原始信息找出来,看看他为啥这么与众不同。
遇到这种问题,你可以给加个 try catch, 插入失败的时候把原始信息记录到日志,这样方便找问题,如果拿到原始信息你自己要是还找不到原因,贴出来,大家才知道该从哪儿下手,不然大家就只能猜,你也得不到答案。
你的 base64 转码大概包含了
+ /这类特殊字符而你没进行处理,接收的时候转义一下试试吧我改成直接存base64后的数据了。不往数据库存原始数据了。后台查看记录的时候,base64解码一道。再观查两天看看还没有这个问题。感谢各位大佬~
问题已经解决了,应该是base64编码的问题,我换成url编码解码,就没出现过这个问题了
你的数据库不支持特定的表情符号吧