前言
最近,楼主碰到个问题,就是使用group_concat()拼接字符串查询的时候,若长度有点长,则会被截取。但是查了mysql里面限制的最长的group_concat()长度,并没有超出。最后发现是因为查询语句最后加上了order by或者group by导致的。
环境
我本地的mysql版本是:
我这边查询出来会进行截取,但是我同事的不会,他的版本是:5.7.14。
Navicat版本我们都是:11.1.8(64-bit)。所以猜测出现该问题原因是和mysql版本有关。
group_concat()函数限制的最大长度
select @@global.group_concat_max_len;
可以使用上面那条语句查询限制长度,如果是使用Navicat的话,可以新建查询,然后再查。我的查询结果是1024。
这个长度是可以修改的,具体可以百度。
问题重现
我的查询语句是:
select
a.id as id,
(select group_concat(d.img_url) from t_dt_img d where a.answer_id=d.answer_id) as answerImgList,
length((select group_concat(d.img_url) from t_dt_img d where a.answer_id=d.answer_id)) as answerImgListLength
from
t_dt_teacheranswer_buy a,t_dt_teacher b,t_dt_teacherAnwser c
where
b.delete_flag=0 and c.delete_flag=0 and b.id=c.teacher_id and c.id=a.answer_id
order by a.id desc;
group_concat()使用的是子查询
查询结果如下:(加group by同样会被截取)
最后一张图片的url本来是:
/filepathmap/answer/answerImage/8db1b114-53c8-47e2-ba93-800a7b5554ce.png
在图中可以看到,到e就被截取了,然后我把这串被截取的字符串重新进行长度查询:
这里显示只有341,但是上面的查询语句出来是364。也就是说,可能是显示的时候被截取了或者是其他情况。
使用不加order by的语句查询:
可以看到能够全部查出来。
解决办法
通过在网上查询,没有说过group_concat后面加了order by或者group by会进行截取字符串的情况。于是我尝试修改语句的写法。最终,改成如下情况可以实现加上order by/group by不会截取字符串的结果。
select
a.id as id,
group_concat(d.img_url) as answerImgList,
length(group_concat(d.img_url)) as answerImgListLength
from
t_dt_teacheranswer_buy a left join t_dt_img d on a.answer_id=d.answer_id,
t_dt_teacher b,t_dt_teacherAnwser c
where
b.delete_flag=0 and c.delete_flag=0 and b.id=c.teacher_id and c.id=a.answer_id
group by a.id
order by a.id desc;
运行结果如下:
可以看到,最后一张图片的url能够全部查询出来,进行长度查询,也是364。
关键是将group_concat()的查询条件也放到where后面!
结语
不知道为什么这个版本的mysql会出现这个情况,我是用远端的mysql查询也一样会被截取。远端的mysql版本是5.7.16。而且我和同事都是直接查询远端的数据库,但是我们本地结果显示的不一样。我目前猜测是,连接远端数据库进行查询的时候,和本地mysql也会有联系。☺☺