記一次mysql的concat和group_concat拼接引起的錯(cuò)誤

實(shí)景描述:
微服務(wù)中,其中一個(gè)項(xiàng)目,調(diào)取查詢數(shù)據(jù)接口,沒(méi)有數(shù)據(jù)返回,查看發(fā)現(xiàn)報(bào)錯(cuò)如下:
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
其實(shí),報(bào)錯(cuò)已經(jīng)很具體了,基本上這種錯(cuò)誤都是sql語(yǔ)法上的錯(cuò)誤或者拼接后sql語(yǔ)句的不規(guī)范。
相關(guān)代碼如下,只展示dao層查詢和mybatis寫(xiě)法:
dao層:

List<Map<String,String>> chaxun();

mybatis.xml

<select id="chaxun" resultType="java.util.Map">
select t.one,r.two from 表1 t left join (select one,CONCAT('\'',group_concat(two separator '\',\''),'\'') as two from 表1 group by one) r on r.one=t.one group by t.one
</select>

比如數(shù)據(jù)查詢出來(lái)是:
one two
1 '11','22','33','44','55'
2 '11','22','33','44','55','66','77','88','99',********以此類推后面再加幾十個(gè)
你會(huì)發(fā)現(xiàn),錯(cuò)誤是因?yàn)?,比如在查詢結(jié)果one為2的two結(jié)果集中,拼接的字符串中,比如最后出現(xiàn)的結(jié)果是:

*******,'11','22','33','44','55','66','77','88','99

什么區(qū)別,一眼識(shí)破吧,沒(méi)錯(cuò),最后少了一個(gè)拼接符號(hào),其實(shí)真實(shí)的數(shù)據(jù)是'99后面還會(huì)有比如'100','101',其實(shí)數(shù)據(jù)已經(jīng)丟失了。究其原因是什么呢,原來(lái)是group_concat,其實(shí)是有一個(gè)陷阱的,它會(huì)有個(gè)長(zhǎng)度大小限制。
首先執(zhí)行語(yǔ)句:
show variables like 'group_concat_max_len'
查看下大小配置是多少,查詢是:
Variable_name Value
group_concat_max_len 1024
在看我們的數(shù)據(jù),大小其實(shí)已經(jīng)超出了1024,所以會(huì)造成數(shù)據(jù)丟失。
MySQL提供的group_concat函數(shù)可以拼接某個(gè)字段值成字符串,如 select group_concat(user_name) from sys_user,默認(rèn)的分隔符是 逗號(hào),即"," ,如果需要自定義分隔符可以使用 SEPARATOR
如:select group_concat(user_name SEPARATOR '_') from sys_user
但是如果 user_name 拼接的字符串的長(zhǎng)度字節(jié)超過(guò)1024 則會(huì)被截?cái)唷?br> 通過(guò)命令 "show variables like 'group_concat_max_len' " 來(lái)查看group_concat 默認(rèn)的長(zhǎng)度:
操作方法:
(1)在MySQL配置文件中加入:
group_concat_max_len = 102400
(2)更簡(jiǎn)單的操作方法,執(zhí)行SQL語(yǔ)句:
SET GLOBAL group_concat_max_len = 102400;
SET SESSION group_concat_max_len = 102400;
注意:該方法缺點(diǎn)是重啟服務(wù)后設(shè)置失效
當(dāng)然,大小看實(shí)際需要,不要以為越大越好,適合的才是最好的。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容