按照指定字符进行合并或拆分是经常碰到的场景,MySQL在合并的写法上比较简单,但是按指定字符拆分相对比较麻烦一点(也就是要多写一些字符)。本文将举例演示如何进行按照指定字符合并及拆分。

1、 合并

MySQL数据库中按照指定字符合并可以直接用group_concat来实现。

创建测试表

mysql> create table tb_group(id int auto_increment primary key ,col1 varchar(20));

Query OK,0 rows affected (0.01 sec)

插入测试数据

mysql> insert into tb_group(col1) values('a'),('c'),('dddd'),('ewdw'),('vxgdh');;

Query OK,5 rows affected (0.01sec)

Records:5 Duplicates: 0 Warnings: 0

合并col1字段的内容

默认是按照逗号进行合并的,例如:

mysql> select group_concat(col1) fromtb_group;+---------------------+

| group_concat(col1) |

+---------------------+

| a,c,dddd,ewdw,vxgdh |

+---------------------+

1 row in set (0.01 sec)

指定分隔符合并,例如指定使用 ||  符号进行合并

mysql> select group_concat(col1,'||') fromtb_group;+-------------------------------+

| group_concat(col1,'||') |

+-------------------------------+

| a||,c||,dddd||,ewdw||,vxgdh|| |

+-------------------------------+

1 row in set (0.00 sec)

注意

默认情况下,合并后的长度不能超过1024,否则结果会被截断

例如,我再写个脚本插入一些数据

# 使用shell脚本来实现

vim test_insert.sh# 添加如下内容

#!/bin/bash

# gjcfor i in {1..1025}domysql-uroot -p'123456' --socket=/data/mysql3306/tmp/mysql.sock -e "insert into testdb.tb_group1(col1)values('a')"

done# 运行脚本插入数据

sh test_insert.sh

mysql> select count(*)fromtb_group;+----------+

| count(*) |

+----------+

| 1030 |

+----------+

1 row in set (0.00 sec)

再进行合并

mysql> select group_concat(col1)cols, length(group_concat(col1)) col_len fromtb_group\G*************************** 1. row ***************************cols: a,c,dddd,ewdw,vxgdh,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,

col_len:1024

1 row in set, 2 warnings (0.01 sec)

可以看出,结果中总长度字节只有1024

对于这种情况,实际使用时肯定是不满足的,如何解决呢?其实此长度与MySQL数据库的group_concat_max_len参数有直接关系(默认为1024)

mysql> show global variables like 'group_concat_max_len';+----------------------+-------+

| Variable_name | Value |

+----------------------+-------+

| group_concat_max_len | 1024 |

+----------------------+-------+

1 row in set (0.08 sec)

那我们调整一下参数看看

/*修改全局参数,这样所有的新连接都会生效*/mysql> set global group_concat_max_len=102400;

Query OK,0 rows affected (0.01sec)/*修改本会话参数,这样当前连接不用退出也可以生效*/mysql> set session group_concat_max_len=102400;

Query OK,0 rows affected (0.00sec)

mysql> show global variables like 'group_concat_max_len';+----------------------+--------+

| Variable_name | Value |

+----------------------+--------+

| group_concat_max_len | 102400 |

+----------------------+--------+

1 row in set (0.00sec)

mysql> show variables like 'group_concat_max_len';+----------------------+--------+

| Variable_name | Value |

+----------------------+--------+

| group_concat_max_len | 102400 |

+----------------------+--------+

1 row in set (0.01 sec)

再合并一下看看

mysql> select group_concat(col1)cols, length(group_concat(col1)) col_len fromtb_group\G*************************** 1. row ***************************cols: a,c,dddd,ewdw,vxgdh,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a

col_len:2069

1 row in set (0.01 sec)

这样结果就对了。因此生产环境中 该参数建议调整为合适的大小。

(Tips:Oracle数据库中可以使用listagg或wm_concat等多种方式实现,也比较简单,可以自行测试)

2、 拆分

按指定字符拆分字符串,也是比较常见的场景。但是MySQL数据库中字符串的拆分没有其他数据库那么方便(其他数据库直接有拆分函数),且需要借助mysql库中的mysql.help_topic表来辅助实现。例子如下:

创建测试表及数据

mysql> create table tb_split(id int primary key auto_increment,col1 varchar(20));

Query OK,0 rows affected (0.01sec)

mysql> insert into tb_split(col1) values('a,b,c,d'),('c,a,g,h');

Query OK,2 rows affected (0.01sec)

Records:2 Duplicates: 0 Warnings: 0

按照逗号拆分

mysql> SELECT a.id, substring_index(substring_index(a.col1, ',', b.help_topic_id + 1), ',',- 1) NAME

FROM tb_split a JOIN mysql.help_topic b

ON b.help_topic_id < (length(a.col1) - length(REPLACE(a.col1, ',', '')) + 1);+----+------+

| id | NAME |

+----+------+

| 1 | a |

| 1 | b |

| 1 | c |

| 1 | d |

| 2 | c |

| 2 | a |

| 2 | g |

| 2 | h |

+----+------+

8 rows in set (0.00 sec)

这样也就实现了拆分。

按指定字符拆分

如果是其他分隔符的,修改瑞阳的分隔符字段即可。

mysql> insert into tb_split(col1) values('a|v|f');

Query OK,1 row affected (0.00sec)

mysql> select * fromtb_split;+----+---------+

| id | col1 |

+----+---------+

| 1 | a,b,c,d |

| 2 | c,a,g,h |

| 3 | a|v|f |

+----+---------+

3 rows in set (0.01sec)

mysql> SELECT a.id, substring_index(substring_index(a.col1, '|', b.help_topic_id + 1), '|',- 1) col_split FROM tb_split a JOIN mysql.help_topic b ON b.help_topic_id < (length(a.col1) - length(REPLACE(a.col1, '|', '')) + 1) where a.id=3;+----+-----------+

| id | col_split |

+----+-----------+

| 3 | a |

| 3 | v |

| 3 | f |

+----+-----------+

3 rows in set (0.00 sec)

这样就完成按照指定字符的合并及拆分了。

3、 结语

本文介绍了MySQL常用的合并及拆分方法,对于擅长写SQL的同学也可以使用其他方式实现,以便解决权限不足(例如拆分时需要使用mysql库的help_topic表的权限)等情况下的需求。

想了解更多内容或参与技术交流可以关注微信公众号【数据库干货铺】或进技术交流群沟通。

mysql按指定长度拆分_MySQL按指定字符合并及拆分相关推荐

  1. C语言fgets()函数(以指定长度读取文件中的字符,并存入字符数组变量中)

    C语言fgets()函数(以指定长度读取文件中的字符,并存入字符数组变量中) 需要引入C 标准库 - <stdio.h> 文章目录 描述 声明 参数 返回值 实例 测试(确实只能读n-1个 ...

  2. mysql 不指定 长度吗_mysql中整数类型后面的数字,是不是指定这个字段的长度?比如int(11),11代表11个字节吗?...

    原先对mysql不太理解,但也没有报错.但理解的不够深入.这次补上. 原来以为int(11)是指11个字节,int(10)就是10个字节.我错了. http://zhidao.baidu.com/li ...

  3. Mysql集群拆分_MySQL 5.7跨集群拆分迁移

    一.背景 一些业务时间久了之后,会进行一些业务逻辑的修改,通常也需要数据库的拆分迁移.这里假设源数据库为集群A(每个集群中仅有一个数据库,这里集群A就代表了数据库A),目标数据库为数据库B.C,之前甲 ...

  4. php指定长度 分割整形,php指定长度分割字符串str_split函数用法示例

    本文实例讲述了php指定长度分割字符串str_split函数用法.分享给大家供大家参考,具体如下: 示例1:$str = 'abcdefgh'; $arr = str_split($str,2); 运 ...

  5. mysql int需要指定长度吗_mysql中为int设置长度除了表明数据长度外还有什么其他的好处?...

    根据个人的实验并结合资料: 1.长度跟可以使用的值的范围无关,值的范围仅跟类型对应的存储字节数和是否unsigned有关: 2.长度指的是显示宽度,比如,指定3位int,那么id为3和id为300的值 ...

  6. linux mysql清除数据库所有表_MySQL修复指定数据库下的所有表

    mysql,mariadb,percona 这几天数据库频繁crash,查看日志发现类似如下的错误: [ERROR] mysqld: Table './database/pre_forum_forum ...

  7. mysql默认值是随机数_mysql生成指定位数的随机数及批量生成随机数的方法

    1. 先介绍几个常用的 mysql 函数 rand()    随机生成 0~1 之间的小数(0<1) ceiling    向上取整 floor    向下取整 2. 生成随机数 -- 生成 3 ...

  8. mysql生成固定位数随机数_mysql生成指定位数的随机数

    1. 先介绍几个常用的 MySQL 函数 RAND()    随机生成 0~1 之间的小数(0<1) CEILING    向上取整 FLOOR    向下取整 2. 生成随机数 [code]- ...

  9. mysql 固定符号分列显示_MySql中指定符号分割并分行展示

    1.涉及到的函数三个: 1.1 REPLACE('value','str1','str2') 用法规则:使用str2替换掉value中的所有的str1; SELECT REPLACE('我来了','来 ...

最新文章

  1. 支持 gRPC 长链接,深度解读 Nacos 2.0 架构设计及新模型
  2. 从介质部署额外域控制器
  3. Struts2-从值栈获取list集合数据(三种方式)
  4. 【原创】C# war3 巨魔精灵 minimap
  5. android 横向stepview,Android 流程指示器 StepView
  6. idea中报错……的解决方式!
  7. 20180925-5 代码规范,结对要求
  8. matlab 0001,2014-11-03号 MatLab初探0001
  9. vuex中actions配合mutation处理axios请求
  10. 如何在旧 Mac 或 MacBook 上安装 Chrome 操作系统?
  11. 日期时间格式与时间戳互转
  12. php二维数组以某个键进行排序
  13. Java面试--Structs
  14. 【ML】使用支持向量回归器进行时间序列预测
  15. ABAP 语法备忘 刘欣
  16. 青龙面板 Nolan 诺兰 2.4 安装教程
  17. [附源码]Python计算机毕业设计调查问卷及调查数据统计系统
  18. 通过在线制图工具绘制阿里云部署图
  19. 【leetcode】714. 买卖股票的最佳时机含手续费
  20. Android 简单音乐播放器开发

热门文章

  1. 这10个要上天的人形机器人,哪个符合你心目中的“人设”?
  2. 神州租车第一季度净利2.74亿 加快布局二手车B2C业务
  3. html 文本框赋值日期代码,如何获取到input输入框 中date的当前日期
  4. 推荐几款常用的Chrome插件
  5. mysql 时间差计算(时、分、秒)和js时间校验和时间转换为所输入时间的最后一秒
  6. Stream.generate
  7. intel openmp
  8. 流水账...12321984543
  9. 弘辽科技:2021年淘宝618优惠券玩法招商
  10. 绝地求生体验服服务器未响应,绝地求生测试服进不去快速解决办法