MySQL字符串拼接函数介绍
在MySQL中,實(shí)現(xiàn)字符串拼接主要有以下3種函數(shù):
concat(x,y,…)
concat_ws(分隔符,x,y,…)
group_concat(distinct xxx order by asd/desc yyy separator ‘分隔符’)
一、concat函數(shù)
concat()函數(shù)用于將多個(gè)字符串連接成一個(gè)字符串
格式:concat(str1,str2,…)
– mysql concat() –
SELECT CONCAT(‘I’,‘love’,‘somebody’); # Ilovesomebody
SELECT CONCAT(‘I’,NULL,‘somebody’); # NULL
SELECT CONCAT(14.4); # 14.4
注意:
如果有任何一個(gè)參數(shù)為NULL,則返回值為NULL;
如果所有參數(shù)為非二進(jìn)制字符串,則返回非二進(jìn)制字符串;
如果含有任一二進(jìn)制字符串,則返回一個(gè)二進(jìn)制字符串;
數(shù)字參數(shù)也會(huì)被轉(zhuǎn)化為與之相等的二進(jìn)制字符串格式,若要避免這種情況,可使用顯式類型 cast,例如:
SELECT CONCAT(CAST(col_a AS CHAR), col_b) FROM table_xxx;
二、concat_ws函數(shù)
concat_ws函數(shù),concat with separator 分隔符,是concat()的特殊形式。
格式:concat_ws(separator, str1, str2,…)
第一個(gè)參數(shù)為分隔符,放在兩個(gè)要連接的字符串之間。
SELECT CONCAT_WS(’-’,‘First’,‘Second’,‘Third’); # First-Second-Third
SELECT CONCAT_WS(’-’,‘First’,NULL,‘Third’); # First-Third
注意:
如果分隔符為NULL,則結(jié)果為NULL;
函數(shù)會(huì)忽略任何分隔符參數(shù)后的NULL值;
函數(shù)不會(huì)忽略任何空字符串,但是會(huì)忽略所有NULL值;
三、group_concat函數(shù)
group_concat函數(shù),實(shí)現(xiàn)分組查詢之后的數(shù)據(jù)進(jìn)行合并,并返回一個(gè)字符串結(jié)果。group_concat函數(shù)用于將多個(gè)字符串拼接成一個(gè)字符串。而MySql默認(rèn)的最大拼接長度為1024個(gè)字節(jié),一般情況下是夠用的,但如果數(shù)據(jù)量特別大,就會(huì)存在java層返回內(nèi)容被截?cái)嗟膯栴},這時(shí),為了保證拼接數(shù)據(jù)的完整性,就需要手工修改配置文件的group_concat_max_len屬性值了。
格式:group_concat( [distinct] 要連接的字段 [order by 排序字段 asc/desc ] [separator ‘分隔符’] )
通過使用distinct可以排除重復(fù)值;
如果希望對(duì)結(jié)果中的值進(jìn)行排序,可以使用order by子句;
separator是一個(gè)字符串值,默認(rèn)為逗號(hào)分隔。
SELECT id,
GROUP_CONCAT(DISTINCT num ORDER BY num DESC SEPARATOR ‘$’) AS cont
FROM test.t_2
GROUP BY id;
結(jié)果:
group_concat還可以與concat_ws嵌套使用,實(shí)現(xiàn)更加復(fù)雜功能。
四、其他字符串連接雜談
“+” & || (不行)
Mysql使用“+”進(jìn)行字符拼接的時(shí)候,會(huì)嘗試將兩端的字段值轉(zhuǎn)換為數(shù)字類型,如果轉(zhuǎn)換失敗則認(rèn)為字段值為0
oracle使用||進(jìn)行字符串拼接,concat 只支持2個(gè)參數(shù),可以多個(gè)嵌套使用
MS 使用+進(jìn)行字符串拼接
group_concat應(yīng)用
用了group_concat后,select里如果使用了limit是不起作用的
用group_concat連接字段的時(shí)候是有長度限制的,并不是有多少連多少,可以使用group_concat_max_len系統(tǒng)變量,設(shè)置允許的最大長度group_concat將某一字段的值按指定的字符進(jìn)行累加,系統(tǒng)默認(rèn)的分隔符是逗號(hào)
一個(gè)簡單的例子:
– 按f_b進(jìn)行分組查詢,將每組中的f_a進(jìn)行累加
select group_concat(f_a) from t_one group by f_b;
修改默認(rèn)的分隔符
– separator 是一個(gè)關(guān)鍵字,后面跟著要進(jìn)行分隔的字符
select group_concat(f_a separator ‘_’) from t_one group by f_b;
排序
select group_concat(f_a order by f_a separator ‘_’) from t_one group by f_b;
和concat使用
group_concat默認(rèn)返回的是BLOB大對(duì)象,可以使用concat,返回字符串,還可以在返回的內(nèi)容,在加入其它的數(shù)據(jù)。
【參數(shù)修改】:group_concat_max_len
??group_concat_max_len是針對(duì)java的jdbc對(duì)mysql查詢結(jié)果集中g(shù)roup_concat函數(shù)列的值的轉(zhuǎn)換長度,而不是針對(duì)group_concat函數(shù)本身能夠容納的字符長度。
舉例:group_concat_max_len默認(rèn)值為1024,如果sql執(zhí)行結(jié)果集中g(shù)roup_concat對(duì)應(yīng)列的長度為1025,則會(huì)被截掉1個(gè)長度;但是group_concat函數(shù)本身還是會(huì)查詢返回1025個(gè)長度的字符。
查看當(dāng)前mysql group_concat_max_len
show variables like ‘group_concat_max_len’;
如果未曾修改會(huì)得到下面結(jié)果:
在這里插入圖片描述
修改mysql group_concat_max_len
如果不方便重啟mysql 可以在mysql狀態(tài)通過命令設(shè)置,,可以設(shè)置作用范圍,臨時(shí)修改,重啟服務(wù)后悔失效,如:
SET GLOBAL group_concat_max_len=102400;
SET SESSION group_concat_max_len=102400;
注:此種方式在mysql重啟后會(huì)讀取配置文件重新設(shè)置,會(huì)導(dǎo)致設(shè)置失效,所以建議依舊要修改配置文件
永久需修改配置文件:my.ini
在[mysqld]下新增配置:group_concat_max_len = 102400,重啟。
特別的,有時(shí)我們并不知需要多大的字節(jié)才能滿足需求,此種情況可以考慮不設(shè)置最大字節(jié)(即采用最大字節(jié)數(shù))即在配置文件設(shè)置group_concat_max_len=-1 ( 4294967295 = 2^32 - 1)
總結(jié)
以上是生活随笔為你收集整理的MySQL字符串拼接函数介绍的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: MySQL之字符串拼接
- 下一篇: 用MS SQL Server事件探查器来