MySQL如何删除phpbb_posts表post_text字段内</t>标签前的空白字符
你之前用RTRIM、普通REPLACE无效,是因为这类方法只能处理指定的单一空白类型,无法覆盖换行、回车、制表符、全角空格、不间断空格等多种不可见空白字符,建议用正则匹配所有空白类型批量处理。
操作前置要求
操作前务必先备份整张表,避免误操作导致数据丢失:
CREATE TABLE phpbb_posts_bak AS SELECT * FROM phpbb_posts;
先执行查询验证处理效果,确认符合预期后再执行更新:
-- 预览处理前后的内容对比,取前10条验证 SELECT post_text AS 原内容, REGEXP_REPLACE(post_text, '[[:space:]]+(</t>)$', '$1') AS 处理后内容 FROM phpbb_posts WHERE post_text LIKE '%</t>' LIMIT 10;
方案1:MySQL 8.0+/MariaDB 10.0+ 版本(支持正则替换)
直接用内置正则函数匹配所有</t>前的空白字符批量替换:
UPDATE phpbb_posts SET post_text = REGEXP_REPLACE(post_text, '[[:space:]]+(</t>)$', '$1') WHERE post_text LIKE '%</t>';
其中[[:space:]]会匹配所有类型的空白字符,$1代表正则里第一个分组匹配到的</t>内容,实现保留标签、删掉前面空白的效果。
方案2:MySQL 5.x 低版本(不支持正则替换)
嵌套移除常见的空白类型:
UPDATE phpbb_posts SET post_text = TRIM(TRAILING ' ' FROM TRIM(TRAILING '\t' FROM TRIM(TRAILING '\r' FROM TRIM(TRAILING '\n' FROM REPLACE(REPLACE(REPLACE(REPLACE(post_text, ' </t>', '</t>'), '\t</t>', '</t>'), '\r</t>', '</t>'), '\n</t>', '</t>') ) ) ) ) WHERE post_text LIKE '%</t>';
这个方案会依次处理普通空格、制表符、回车符、换行符四种最常见的空白类型,覆盖绝大多数场景。
内容的提问来源于stack exchange,提问作者Teebling
相关产品推荐
相关产品推荐

