最近在公司实习的时候有一个很普通的需求就是要根据用户给出的查询条件在数据库中查出所有符合的结果,由于每个用户存储的数据在数据库中对应着许多条记录,因此我想到了之前在学校使用过的group_concat()函数,这个函数是可以根据group by的键将数据库中符合条件的数据相连。因为在学校的时候数据量并没有很大,因此没有出现问题,但是在最近的使用中,我发现结果怎么也对不上,一直都是缺失的。后来经过断点调试以及sql的对比,才发现了问题。
原因
就是group_concat函数连接的结果是有长度限制的,默认最长为1024个字符,后面大于1024的字符会被截断,也就是说如果你的结果非常多,你最终连接在一起后会丢失部分数据。
解决办法
首先在数据库中执行:
show variables like ‘group_concat_max_len’;
这条语句可以检查你的当前设置的最大连接长度,如果已经很大了,说明你数据丢失和这个函数应该没啥关系,赶紧去找别的错吧
紧接着输入:
set global group_concat_max_len = 你想要的长度;
set session group_concat_max_len = 你想要的长度;
这一步是设置当前的最大长度,设置了之后就可以将所有数据连在一起啦,但是缺点是当服务器重启的时候就会失效
一劳永逸的办法:
如果你有权限修改mysql的配置,直接修改配置文件中的配置是最方便的,windows是在mysql的安装目录那里的my.ini。linux操作系统则是叫my.cnf,一般是在etc/mysql里面,我有一台学生机装的ubuntu系统是在etc/mysql/mysql.conf.d里面的,这个可能需要你自己去找一下咯。
直接在文件中修改或新增以下语句
group_concat_max_len = 你想要的长度
然后重启服务即可