39人参与 • 2026-09-08 • 正则表达式
日常开发中经常遇到数据库字段内容需要替换的场景:修正错别字、替换旧域名、清理多余符号、批量修改文本内容。很多新手只会简单replace()函数,遇到模糊匹配、正则替换、局部更新时容易踩坑。本文整理mysql字符串替换的常用方案、语法、示例以及常见陷阱。
重要提醒:执行update替换前务必先select验证结果,最好先备份数据,一旦误更新,数据很难恢复!
replace(原字符串, 要查找的子串, 替换后的新子串)
特点:精确匹配,不支持模糊、正则,大小写取决于数据库字符集排序规则。
select replace('www.oldsite.com','oldsite','newsite') as result;
输出:www.newsite.com
假设表article,字段content,把内容里所有2025替换成2026
-- 先预览替换效果,不要直接执行更新! select id,content,replace(content,'2025','2026') from article where content like '%2025%'; -- 确认无误后执行更新 update article set content = replace(content,'2025','2026') where content like '%2025%';
where条件不是必须的,加上可以过滤不需要更新的行,减少锁表、提升性能,大数据表强烈建议带上。
replace会替换全部匹配项,如果只想替换第一次出现的文本,原生replace做不到,需要结合locate、substring字符串截取函数实现。
示例:只替换第一个abc为xyz
select
concat(
substring(str,1,locate('abc',str)-1),
'xyz',
substring(str,locate('abc',str)+length('abc'))
)
from test;
原理:
mysql 8.0+ 才提供 regexp_replace(),5.6/5.7没有正则替换函数!不要在5.7中直接使用,会报函数不存在。
regexp_replace(原始字符串,正则表达式,替换字符串[,起始位置[,匹配次数[,匹配模式]]])
select regexp_replace('a1b2c3','[0-9]','') as res;
-- 结果 abc
select regexp_replace('test1 test1','test1','demo',1,1) as res;
-- 结果 demo test1
--预览 select title,regexp_replace(title,'https?://old\.com','https://new.com') from news where title regexp 'https?://old\\.com'; --更新 update news set title=regexp_replace(title,'https?://old\.com','https://new.com') where title regexp 'https?://old\\.com';
方案1:程序代码中读取数据,正则处理后写回数据库(推荐)
方案2:自定义函数实现正则替换,生产环境不建议随意增加自定义函数,维护成本高。
把[a]→苹果,[b]→香蕉,多层嵌套replace
select replace(replace(content,'[a]','苹果'),'[b]','香蕉') from fruit;
注意替换顺序,先替换长字符串,再替换短字符串,避免短串提前干扰长串匹配。
不要用replace,mysql提供专用函数trim()
update product set name=trim(name);
ltrim()去除左侧空格,rtrim()去除右侧空格。
1.先select预览,后update更新
直接执行不带预览的update,一旦写错替换内容,数据损坏无法撤销。生产环境建议开启事务:
start transaction; update article set content=replace(content,'旧文本','新文本'); --检查数据无误再提交,出错执行rollback回滚 commit; --rollback;
2.大数据表批量更新风险
百万级大表直接update会锁表,阻塞业务写入。建议分批循环更新,不要一次性全表更新。
3.区分精确替换和正则替换
固定文本优先replace,性能远高于正则;模糊规则匹配才使用regexp_replace(mysql8.0)。
4.字符集大小写问题
utf8mb4_general_ci不区分大小写,utf8mb4_bin区分大小写,replace行为会随之改变。
5.null值陷阱
如果字段为null,replace返回null;更新前判断非空:where col is not null
| 需求 | 推荐方案 | 适用版本 |
|---|---|---|
| 固定字符串全部替换 | replace() | 5.6/5.7/8.0通用 |
| 只替换第一次匹配 | substring+locate拼接 / mysql8.0 regexp_replace指定次数 | 全部版本 |
| 正则模糊替换、移除数字/特殊字符 | regexp_replace() | mysql8.0及以上 |
| 去除首尾空格 | trim() | 全部版本 |
| mysql5.7正则替换 | 应用程序处理 | 5.7 |
mysql字符串替换并不复杂,但很多故障都源于缺少预览、大表无分批更新、混淆版本函数。简单文本替换首选原生replace,复杂规则依赖正则时尽量升级至mysql8.0。
如果你有批量清理脏数据、富文本内容批量替换、多字段同时替换等场景,我可以提供对应的可直接运行sql模板。
以上就是mysql实现批量替换与正则替换字符串的完整实战的详细内容,更多关于mysql替换字符串的资料请关注代码网其它相关文章!
您想发表意见!!点此发布评论
版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。
发表评论