在MySQL中,实现字符串拼接主要有以下3种函数:
- concat(x,y,…)
- concat_ws(分隔符,x,y,…)
- group_concat(distinct xxx order by asd/desc yyy separator ‘分隔符’)
一、concat函数
concat()函数用于将多个字符串连接成一个字符串
格式:concat(str1,str2,…)
– mysql concat() –
SELECT CONCAT('I','love','somebody'); # Ilovesomebody
SELECT CONCAT('I','NULL,'somebody'); # NULL
SELECT CONCAT(14.4); # 14.4
注意:
如果有任何一个参数为NULL,则返回值为NULL;
如果所有参数为非二进制字符串,则返回非二进制字符串;
如果含有任一二进制字符串,则返回一个二进制字符串;
数字参数也会被转化为与之相等的二进制字符串格式,若要避免这种情况,可使用显式类型 cast,例如:
SELECT CONCAT(CAST(col_a AS CHAR), col_b) FROM table_xxx;
二、concat_ws函数
concat_ws函数,concat with separator 分隔符,是concat()的特殊形式。
格式:concat_ws(separator, str1, str2,…)
第一个参数为分隔符,放在两个要连接的字符串之间。
SELECT CONCAT_WS('-','First','Second','Third'); # First-Second-Third
SELECT CONCAT_WS('-','First',NULL,'Third'); # First-Third
注意:
如果分隔符为NULL,则结果为NULL;
函数会忽略任何分隔符参数后的NULL值;
函数不会忽略任何空字符串,但是会忽略所有NULL值;
三、group_concat函数
group_concat函数,实现分组查询之后的数据进行合并,并返回一个字符串结果。group_concat函数用于将多个字符串拼接成一个字符串。而MySql默认的最大拼接长度为1024个字节,一般情况下是够用的,但如果数据量特别大,就会存在java层返回内容被截断的问题,这时,为了保证拼接数据的完整性,就需要手工修改配置文件的group_concat_max_len属性值了。
格式:group_concat( [distinct] 要连接的字段 [order by 排序字段 asc/desc ] [separator ‘分隔符’] )
通过使用distinct可以排除重复值;
如果希望对结果中的值进行排序,可以使用order by子句;
separator是一个字符串值,默认为逗号分隔。
SELECT id,
GROUP_CONCAT(DISTINCT num ORDER BY num DESC SEPARATOR '$') AS cont
FROM test.t_2
GROUP BY id;
结果:
group_concat还可以与concat_ws嵌套使用,实现更加复杂功能。
四、其他字符串连接杂谈
“+” & || (不行)
Mysql使用“+”进行字符拼接的时候,会尝试将两端的字段值转换为数字类型,如果转换失败则认为字段值为0
oracle使用||进行字符串拼接,concat 只支持2个参数,可以多个嵌套使用
MS 使用+进行字符串拼接
group_concat应用
用了group_concat后,select里如果使用了limit是不起作用的
用group_concat连接字段的时候是有长度限制的,并不是有多少连多少,可以使用group_concat_max_len系统变量,设置允许的最大长度group_concat将某一字段的值按指定的字符进行累加,系统默认的分隔符是逗号
一个简单的例子:
– 按f_b进行分组查询,将每组中的f_a进行累加
select group_concat(f_a) from t_one group by f_b;
修改默认的分隔符
– separator 是一个关键字,后面跟着要进行分隔的字符
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默认返回的是BLOB大对象,可以使用concat,返回字符串,还可以在返回的内容,在加入其它的数据。
【参数修改】:group_concat_max_len
group_concat_max_len是针对java的jdbc对mysql查询结果集中group_concat函数列的值的转换长度,而不是针对group_concat函数本身能够容纳的字符长度。
举例:group_concat_max_len默认值为1024,如果sql执行结果集中group_concat对应列的长度为1025,则会被截掉1个长度;但是group_concat函数本身还是会查询返回1025个长度的字符。
查看当前mysql group_concat_max_len
show variables like ‘group_concat_max_len’;
如果未曾修改会得到下面结果:
在这里插入图片描述
修改mysql group_concat_max_len
如果不方便重启mysql 可以在mysql状态通过命令设置,,可以设置作用范围,临时修改,重启服务后悔失效,如:
SET GLOBAL group_concat_max_len=102400;
SET SESSION group_concat_max_len=102400;
注:此种方式在mysql重启后会读取配置文件重新设置,会导致设置失效,所以建议依旧要修改配置文件
永久需修改配置文件:my.ini
在[mysqld]下新增配置:group_concat_max_len = 102400,重启。
特别的,有时我们并不知需要多大的字节才能满足需求,此种情况可以考虑不设置最大字节(即采用最大字节数)即在配置文件设置group_concat_max_len=-1 ( 4294967295 = 2^32 - 1)
最后
深知大多数初中级Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则近万的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《Java开发全套学习资料》送给大家,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
小编已加密:aHR0cHM6Ly9kb2NzLnFxLmNvbS9kb2MvRFVrVm9aSGxQZUVsTlkwUnc==出于安全原因,我们把网站通过base64编码了,大家可以通过base64解码把网址获取下来。