工作记录------group_concat函数长度问题
背景:页面在数据展示时,报错,错误显示:String index out of range: -1
异常信息
java.lang.StringIndexOutOfBoundsException: String index out of range: -1
at java.lang.String.substring(String.java:1967)
意味着字符串在进行截取时,发生了数组越界行为,越界的数值为-1.
经过代码定位:
setBean.setName(name[n].substring(0, name[n].indexOf("}")));
是一个简单的字符串截取。这个字符串的值来源与数据库查询,在数据库查询时,使用group_concat函数进行组装的字符串。
GROUP_CONCAT( DISTINCT CONCAT(desc, '}', code) SEPARATOR '{' ) as name,
字段desc与字段code拼接,再通过GROUP_CONCAT()函数,将满足条件的所有值拼接成一列字符串,每一列的值通过{作为分隔符
按此逻辑,必会存在}符号。
发现
在数据库中执行sql,发现一部分字符串结果长度缺失。显示的数据不完整。
结论
当时经过字符串长度进行对比,发现由于数据量特别大,只有字符串特别长的才会出现字段缺失的情况,怀疑group_concat()函数存在长度限制。
执行以下sql语句,查看group_concat()函数的最大长度限制,发现是1024。
show variables LIKE "group_concat_max_len";
SELECT @@global.group_concat_max_len;
设置最大长度语句
SET GLOBAL group_concat_max_len=102400;
SET SESSION group_concat_max_len=102400;
一个全局最大长度,一个会话级别最大长度。
执行过后,问题得到解决。