首页 > 问答 > 关键词  > mysql最新资讯  > 正文

MySQL怎么按指定字符合并及拆分 详细实例分析

2020-07-01 10:00 · 稿源:数据库干货铺

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

1、 合并

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

创建测试表

mysql>createtabletb_group(idintauto_incrementprimarykey,col1varchar(20));
QueryOK,0rowsaffected(0.01sec)

插入测试数据

mysql>insertintotb_group(col1)values('a'),('c'),('dddd'),('ewdw'),('vxgdh');;
QueryOK,5rowsaffected(0.01sec)
Records:5Duplicates:0Warnings:0

合并col1 字段的内容

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

mysql>selectgroup_concat(col1)fromtb_group;
+---------------------+|group_concat(col1)|+---------------------+|a,c,dddd,ewdw,vxgdh|+---------------------+1rowinset(0.01sec)

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

mysql>selectgroup_concat(col1,'||')fromtb_group;
+-------------------------------+|group_concat(col1,'||')|+-------------------------------+|a||,c||,dddd||,ewdw||,vxgdh|||+-------------------------------+1rowinset(0.00sec)

注意

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

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

#使用shell脚本来实现
vimtest_insert.sh#添加如下内容
#!/bin/bash
#gjcforiin{1..1025}do
mysql-uroot-p'123456'--socket=/data/mysql3306/tmp/mysql.sock-e"insertintotestdb.tb_group1(col1)values('a')"done#运行脚本插入数据shtest_insert.sh
mysql>selectcount(*)fromtb_group;+----------+|count(*)|+----------+|1030|+----------+1rowinset(0.00sec)

再进行合并

mysql>selectgroup_concat(col1)cols,length(group_concat(col1))col_lenfromtb_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:10241rowinset,2warnings(0.01sec)

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

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

mysql>showglobalvariableslike'group_concat_max_len';+----------------------+-------+|Variable_name|Value|+----------------------+-------+|group_concat_max_len|1024|+----------------------+-------+1rowinset(0.08sec)

那我们调整一下参数看看

/*修改全局参数,这样所有的新连接都会生效*/mysql>setglobalgroup_concat_max_len=102400;
QueryOK,0rowsaffected(0.01sec)/*修改本会话参数,这样当前连接不用退出也可以生效*/mysql>setsessiongroup_concat_max_len=102400;
QueryOK,0rowsaffected(0.00sec)
mysql>showglobalvariableslike'group_concat_max_len';+----------------------+--------+|Variable_name|Value|+----------------------+--------+|group_concat_max_len|102400|+----------------------+--------+1rowinset(0.00sec)
mysql>showvariableslike'group_concat_max_len';+----------------------+--------+|Variable_name|Value|+----------------------+--------+|group_concat_max_len|102400|+----------------------+--------+1rowinset(0.01sec)

再合并一下看看

mysql>selectgroup_concat(col1)cols,length(group_concat(col1))col_lenfromtb_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:20691rowinset(0.01sec)

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

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

2、 拆分

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

创建测试表及数据

mysql>createtabletb_split(idintprimarykeyauto_increment,col1varchar(20));
QueryOK,0rowsaffected(0.01sec)
mysql>insertintotb_split(col1)values('a,b,c,d'),('c,a,g,h');
QueryOK,2rowsaffected(0.01sec)
Records:2Duplicates:0Warnings:0

按照逗号拆分

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

这样也就实现了拆分。

按指定字符拆分

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

mysql>insertintotb_split(col1)values('a|v|f');
QueryOK,1rowaffected(0.00sec)
mysql>select*fromtb_split;+----+---------+|id|col1|+----+---------+|1|a,b,c,d||2|c,a,g,h||3|a|v|f|+----+---------+3rowsinset(0.01sec)
mysql>SELECTa.id,substring_index(substring_index(a.col1,'|',b.help_topic_id+1),'|',-1)col_splitFROMtb_splitaJOINmysql.help_topicbONb.help_topic_id<(length(a.col1)-length(REPLACE(a.col1,'|',''))+1)wherea.id=3;+----+-----------+|id|col_split|+----+-----------+|3|a||3|v||3|f|+----+-----------+3rowsinset(0.00sec)

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

3、 结语

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

本文转载自微信公众号【数据库干货铺】。

举报

  • 相关推荐
  • 周扬青回应只谈姐弟恋:可以符合自己的审美

    ​近日,艺人周扬青在直播中回应网友关于“只谈姐弟恋”的质疑,直言当前择偶标准与年龄及现实需求相关。她坦言,自己现年36岁,若不选择年龄较小的伴侣,“难道去谈‘老嘚’(指年龄差距过大者)吗?这显然不符合我的审美。”周扬青进一步解释

  • 被诉“反垄断”的谷歌称:为了美国,我们不能被拆分

    美国加州联邦法院在审理谷歌反垄断案中,多位专家提出观点,支持谷歌整体形象及保护国家安全的重要性。司法部强调为打破谷歌非法垄断,推出Chrome浏览器是必要的,并建议通过拆分谷歌来解决其在网络搜索市场上的垄断问题。此外,谷歌已表现出以人工智能模型Gemini为核心加强其搜索支持能力的意图,同时面临来自苹果、三星等公司的竞争压力。本次审理由下个月9日结案,法院将在8日前做出判决。业内预测,若判决对谷歌不利,谷歌将立即提起上诉。

  • 阿里开源通义新模型:指定首尾图片生成视频

    快科技4月18日消息,据报道,阿里巴巴旗下通义万相宣布开源其创新视频生成技术首尾帧生视频14B模型。这项突破性AI技术能够根据用户提供的起始和结束画面,智能生成720p高清过渡视频,为视频创作带来全新可能。该模型通过先进的深度学习算法,能够精准理解输入画面的内容、风格及主题特征。当用户提供首尾两帧图像后,模型会智能分析画面中的视觉元素,包括物体形�

  • 韶音成为伦敦马拉松官方唯一指定运动耳机,以开放聆听助力跑者突破极限

    4月27日,伦敦马拉松激情开跑,全球领先的开放式耳机品牌Shokz韶音正式成为2025年赛事官方唯一指定运动耳机。作为世界马拉松大满贯赛事之一,本届比赛吸引了包括奥运冠军塔米拉特·托拉、半马世界纪录保持者基普里莫等顶尖选手参赛。韶音不仅打造了专属助威区,还推出联名快闪店,其开放式耳机技术让跑者在享受音乐的同时保持环境感知,兼顾运动安全。此次合作进一步巩固了韶音在专业运动耳机领域的领先地位,传递"开放聆听"的运动理念。

  • AI日报:小米首个推理大模型开源Xiaomi MiMo;快手上线AI笔记工具“喵记多”;腾讯拆分AI团队

    本文汇总了AI领域最新动态:1)小米开源70亿参数大模型Xiaomi MiMo,在数学推理和代码竞赛中超越OpenAI和阿里模型;2)快手推出AI笔记工具"喵记多",简化笔记管理;3)Luma AI发布电影级镜头控制API,降低视频生成门槛;4)腾讯重组AI团队,加大语言模型研发投入;5)Anthropic为Claude引入新语音"Glassy";6)谷歌NotebookLM新增50+语言音频概述功能;7)xAI将发布Grok3.5模型;8)Meta推出独立AI助手应用挑战ChatGPT;9)OpenAI紧急修复GPT-4o"谄媚"问题;10)Mac本地AI助手Simular升级隐私保护;11)CameraBench项目帮助AI理解镜头运动;12)谷歌推出个性化语言学习AI工具。

  • 欧税通为您分享获得EPR注册号的详细步骤和要求

    以下是获得EPR注册号的详细步骤和要求: 确定注册需求: 确定您的产品是否属于EPR法规涵盖的范围。不同的国家和地区有不同的EPR法规和要求。 如果您是生产者、进口商或在欧洲市场销售产品的卖家,您可能需要注册EPR。 选择注册国家和地区: 根据您销售产品的国家和地区,确定需要在哪些国家进行EPR注册。例如,如果您在法国和德国销售产品,您需要分别在这两个国家�

  • 如何在欧说通平台填写土代资料?看详细流程步骤

    以欧税通平台为例,看看办理土耳其授权代表如何填写资料?一、登录欧税通在电脑端浏览器(建议谷歌或者火狐),使用注册的手机号登录欧税通官网(www.evatmaster.com)操作:支付订单位置:【工作台】--【我的订单】二、填写资料(带星号必填,不带星可以不填)1.公司信息填写企业店铺填写:执照信息/注册号填写【社会信用代码】,注册地址填写【执照上面地址的拼音】

  • 阿里云弹性计算十五周年发布第九代Intel实例,重新定义企业级计算“新标杆”

    2025年4月9日,阿里云在AI峰会上发布第九代企业级实例g9i,搭载英特尔®至强®6处理器,性能全面提升:算力提升20%、三级缓存提升50%、全核睿频达3.6GHz,同时价格较上代降低5%。该实例集成英特尔®AMX加速引擎,新增FP16支持,AI处理效率显著提升。蚂蚁数科的ZOLOZ反欺诈系统部署后,端到端性能提升10%,人脸识别精度损失降低23%。阿里云通过15年技术积累,推出更高性能、更普�

  • 苹果深陷多重危机 股价何处是底:分析师预测还要暴跌28%!

    快科技4月22日消息,股票研究公司Moffett Nathanson认为,尽管2025年内已经累跌超23%,短期内苹果股价的跌势不会迎来任何缓解。Moffett Nathanson的分析师Craig Moffet重申了对苹果的卖出”评级,并将其目标价从184美元大幅下调至141美元。这意味着,相较于苹果上周四196.98美元的收盘价,Moffet认为其股价未来还可能下跌超28%。Moffet指出,苹果目前面临的困境远不止股价下跌,由于美国的关税政策和贸易战等问题,苹果的长期盈利预期被下调。虽然美国暂停对智能手机加征对等关税后,对苹果来说最坏的情况暂时被排除了,但苹果进口产品仍?

  • KIOKOP首发AI肌肉疲劳分析系统,定义运动恢复新基准

    4月23日,KIOKOP正式发布全球首款AI肌肉疲劳分析系统,其旗舰产品Max系列同步升级。该系统创新性地融合275mmHg超高压技术与工业级生物传感,实现毫米级深层肌肉监测,精度较传统设备提升17倍。搭载百万级数据训练的AI算法,可提前6-24小时预测运动损伤风险,实测拦截准确率达90%。同时集成850nm红外热疗技术,使乳酸清除效率提升3.8倍。产品采用双独立控制、五年超长待机等15项创新设计,覆盖-20℃至45℃工作环境。目前品牌已在12个国家和地区建立代理网络,计划2025年推出上肢等细分场景产品。这款融合预测性健康管理的前沿科技产品,标志着运动康复领域正式进入智能防护新时代。