实景描述:
微服务中,其中一个项目,调取查询数据接口,没有数据返回,查看发现报错如下:
caused by:com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException:You have an error in your SQL syntax;check the manual that corresponds to your MySQL server version for the right syntax to use near '' 123456)
GROUP BY t2.label' at line 6
其实,报错已经很具体了,基本上这种错误都是sql语法上的错误或者拼接后sql语句的不规范。
相关代码如下,只展示dao层查询和mybatis写法:
dao层:
List
mybatis.xml
比如数据查询出来是:
one two
1 '11','22','33','44','55'
2 '11','22','33','44','55','66','77','88','99',********以此类推后面再加几十个
你会发现,错误是因为,比如在查询结果one为2的two结果集中,拼接的字符串中,比如最后出现的结果是:
*******,'11','22','33','44','55','66','77','88','99
什么区别,一眼识破吧,没错,最后少了一个拼接符号,其实真实的数据是'99后面还会有比如'100','101',其实数据已经丢失了。究其原因是什么呢,原来是group_concat,其实是有一个陷阱的,它会有个长度大小限制。
首先执行语句:
show variables like 'group_concat_max_len'
查看下大小配置是多少,查询是:
Variable_name Value
group_concat_max_len 1024
在看我们的数据,大小其实已经超出了1024,所以会造成数据丢失。
MySQL提供的group_concat函数可以拼接某个字段值成字符串,如 select group_concat(user_name) from sys_user,默认的分隔符是 逗号,即"," ,如果需要自定义分隔符可以使用 SEPARATOR
如:select group_concat(user_name SEPARATOR '_') from sys_user
但是如果 user_name 拼接的字符串的长度字节超过1024 则会被截断。
通过命令 "show variables like 'group_concat_max_len' " 来查看group_concat 默认的长度:
操作方法:
(1)在MySQL配置文件中加入:
group_concat_max_len = 102400
(2)更简单的操作方法,执行SQL语句:
SET GLOBAL group_concat_max_len = 102400;
SET SESSION group_concat_max_len = 102400;
注意:该方法缺点是重启服务后设置失效
当然,大小看实际需要,不要以为越大越好,适合的才是最好的。