问题场景:

在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字段拼接起来有总共有多长