问题场景:
在MySQL线上排错过程中,发现接口返回的数据与数据库实际数据不符,相差较多。经过排查,发现问题出在GROUP_CONCAT函数上。默认情况下,GROUP_CONCAT函数返回的结果大小被MySQL限制为1024字节的长度。当user_name字段拼接的字符串长度超过1024字节时,会被截断。为了解决这个问题,记录下解决方案并实践。
MySQL提供的group_concat函数可以拼接某个字段值成字符串,如:`select group_concat(user_name) from sys_user`,默认的分隔符是逗号。但是,如果user_name拼接的字符串的长度字节超过1024,则会被截断。
通过命令`show variables like 'group_concat_max_len'`来查看group_concat默认的长度:`show variables like 'group_concat_max_len';`。
解决方案:
1. 编写几个SQL语句来验证问题。
首先,我们需要查找数据的最大长度。可以使用`SELECT user_name FROM sys_user;`查看user_name字段有多少位。假设都是6位,可以使用以下SQL语句计算user_name字段有多少个乘以6位:
```sql
SELECT COUNT(user_name)*6 AS '个数*位数' FROM sys_user;
```
然后,使用`SELECT GROUP_CONCAT(user_name SEPARATOR '') FROM sys_user;`查看user_name字段拼接起来的结果:
```sql
SELECT group_concat(user_name SEPARATOR '') FROM sys_user;
```
接着,使用以下SQL语句查看user_name字段拼接起来的总长度:
```sql
SELECT LENGTH(a.aa) AS '字段拼接长度' FROM (SELECT GROUP_CONCAT(user_name SEPARATOR '') AS aa FROM sys_user) a;
```
通过以上SQL语句,我们可以验证GROUP_CONCAT查出来的长度是否为1024,以及查询结果是否与实际数据相符。
在这里插入图片描述
可以看到只能查出1024位6972
在这里插入图片描述
2.这时就需要修改 group_concat_max_len 参数到需要的大小,比如102400,扩大一百倍。使得我们使用GROUP_CONCAT函数查询的时候可以正常返回。修改的方式有两种:
2.1方法一:(永久生效需要重启)在MySQL的配置文件中加入如下配置:
#先查询group_concat_max_len的长度 show variables like "group_concat_max_len";
在这里插入图片描述
# 在mysqld下加入 group_concat_max_len = 102400
在这里插入图片描述
重启生效
#再次查询group_concat_max_len的长度 show variables like "group_concat_max_len";
在这里插入图片描述
2.2.方法二:(临时使用,重启失效)更简单的操作方法,执行SQL语句:
#先查询group_concat_max_len的长度 show variables like "group_concat_max_len";
在这里插入图片描述
# 设置长度 SET GLOBAL group_concat_max_len = 102400; SET SESSION group_concat_max_len = 102400;
在这里插入图片描述
长度更改为102400
在这里插入图片描述
3.我们再次用第1步的sql来验证
select LENGTH(a.aa) as '字段拼接长度' from(select group_concat(user_name SEPARATOR '') as aa from sys_user ) a; #查看user_name字段拼接起来有总共有多长