像毒一样的Bug之group_concat默认长度限制

问题:mysql数据库使用group_concat将多个图片的地址连接,每个地址长度都标准是55,发现在超过18张后,第十九张图片地址会被截断;

原因:mysql的group_concat默认连接长度为1024字符,也就是说你需要连接后的连接超过1024字符,它只会显示这么长,其余部分都会被截取丢掉。

解决办法: 
(1)使用sql语句(亲测可用)

SET GLOBAL group_concat_max_len=102400;
SET SESSION group_concat_max_len=102400; 
  • 1
  • 2

(2)修改配置文件 
在mysql配置文件中添加如下这句,修改配置文件后记得需要重启mysql服务

group_concat_max_len = 102400
  • 1

解决过程:前两天的项目中写了一个获取资源数据的接口,每条数据对应很多图片,图片在保存的的时候不是直接以逗号分隔而是单独存表通过外键连接的。在查询的时候就想到了使用group_concat将每一个资源数据对应的图片地址查询出然后以逗号连接成一条数据。今天下午同事突然告诉我,好像图片一超过七张就显示不出来了。查了一下后端返回数据,确实后面的地址不全导致加载不到。 
通过debug打出执行sql,直接在navicat中运行发现结果一样,sql语句如下

SELECT a.*,( SELECT GROUP_CONCAT( image ) FROM resource_image b WHERE b.resource_data_id = a.id ) AS images FROM resource_data a WHERE a.state <> 0
  • 1

查了好久一无所获,最后将整个项目数据库导出到另一台服务器上,运行同样的sql居然没有截断。就断定这绝壁是那个数据库问题,然后又换了一台服务器,七张图片时没有截断正常。把整个项目部署了一套在自己觉得没问题的服务器上,再查看数据,七张图片没问题,但好像超过十八张就又出问题了,这一次是所有服务器统一,当然第一台服务器还是在七张的时候截。此时突然有个想法出现,是不是group_concat的问题,果断百度了group_concat的长度,果真如此,原来mysql默认限制group_concat长度1024,也就是最后那几台服务器在第19张图片地址的时候截取的长度,而第一台明显被人设置过。在使用两条sql语句SET GLOBAL group_concat_max_len=102400;SET SESSION group_concat_max_len=102400; 之后问题果断解决。 
在这次问题的解决过程中,依然有些盲目的乱猜问题,没有从实际出发。当然数据库基础不扎实是最主要的原因,打算找个时间重头扎扎实实学习一边数据库。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

yehui186

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值