当前位置:首页 > 文章列表 > 数据库 > MySQL > MySQL REGEXP_REPLACE 怎样清理字段中的连续空格

MySQL REGEXP_REPLACE 怎样清理字段中的连续空格

来源:17golang原创 2026-10-28 23:14:31 0浏览 收藏

只需把字段中的连续普通空格压成一个时,可用 REGEXP_REPLACE(display_name, ' {2,}', ' ');如果还要去掉首尾普通空格,再包一层 TRIM()。两项规则要分开决定:压缩连续空格不会自动删除首尾的单个空格,也不等于清理所有空白字符。

官方文档地址:https://dev.mysql.com/doc/refman/8.4/en/regexp.html

本文使用 MySQL 8.4 的函数语义。我更倾向于先做一个保留原值的预览,再决定是否写回;下面把“导入名单的展示名清理”做成独立临时表小项目。它是供读者运行的示例,并非真实客户数据或已经执行的清理记录。

先确定哪些间距可以改

本项目只处理普通空格 U+0020,目标是把两个及以上连续普通空格变成一个。模式 ' {2,}' 中,单引号后的第一个字符就是普通空格,{2,} 表示重复至少两次。替换字符串 ' ' 中也有一个普通空格,不能误写成空字符串。

对于展示名,连续空格可能是导入噪声;对于排版文本、代码片段和格式化编号,空格可能有意义。我的选择是先明确字段用途,宁可保留不确定的字符,也不默认把所有空白都统一。

建立能看清差异的临时样本

使用 MySQL 8.4、支持 utf8mb4 的连接,在同一会话中完成以下片段。临时表属于当前会话;不要把其名称替换为生产表后整段执行。示例把原始字段与清理字段分开,避免在试验中覆盖来源值。

-- 记录实际服务版本,并让中文样本使用 utf8mb4。
SELECT VERSION();
SET NAMES utf8mb4;

-- 仅创建会话临时表,不修改真实业务表。
CREATE TEMPORARY TABLE space_cleanup_demo (
    id INT PRIMARY KEY,
    raw_name VARCHAR(120) NULL,
    clean_name VARCHAR(120) NULL
) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4;

-- CHAR(9) 与 CHAR(10) 分别构造制表符和换行,避免依赖反斜杠转义设置。
INSERT INTO space_cleanup_demo (id, raw_name) VALUES
    (1, '  林   海  '),
    (2, '周 宁'),
    (3, CONCAT('许', CHAR(9), '安')),
    (4, CONCAT('江', CHAR(10), '青')),
    (5, ''),
    (6, NULL);

我会把 NULL 和空字符串一起放进样本,因为它们表达不同的业务状态:一个可能表示没有提供,另一个是已经提供但为空。用清理动作顺手把两者合并,往往比多留一个空格更难恢复原意。

先预览压缩规则,再选择是否 TRIM

-- 第一列仅压缩重复普通空格;第二列另加首尾普通空格清理。
SELECT id,
       raw_name,
       HEX(raw_name) AS raw_hex,
       REGEXP_REPLACE(raw_name, ' {2,}', ' ') AS collapsed_name,
       TRIM(REGEXP_REPLACE(raw_name, ' {2,}', ' ')) AS trimmed_name
FROM space_cleanup_demo
ORDER BY id;

按这条规则,样本 1 的多个普通空格会压缩,只有加 TRIM 的表达式才去掉两端空格;样本 2 保留原有单空格;样本 3、4 的制表符和换行不在匹配范围内;空字符串保持为空,NULL 仍为 NULL。这些是表达式的预期语义,不是伪造的数据库输出截图。

HEX() 是辅助辨认不可见字符的文字工具:普通空格对应十六进制 20,制表符为 09,换行为 0A。客户端显示时看着“都是一段空白”,不代表它们是同一个字符。

原始字段普通空格规则和可选首尾清理的静态关系
结构说明图:匹配规则只覆盖连续普通空格,TRIM 是可选的另一项规则;制表符和换行在本项目的保留范围内。

REGEXP_REPLACE 省略 occurrence 时默认替换全部匹配,不需要再加其他语言常用的 g 参数。显式设置 occurrence 为 1 则只处理第一个匹配片段,不适合这里的全字段清理目标。

用事务试写,原值继续保留

确定预览符合业务语义后,才给 clean_name 赋值。下面在 InnoDB 临时表上演示事务试写,并以 ROLLBACK 结束,便于重复实验;创建表在事务之前完成,不要把 DDL 当成可以随意一起回滚的普通更新。

-- 在临时样本上写入清理字段,不覆盖 raw_name。
START TRANSACTION;

UPDATE space_cleanup_demo
SET clean_name = REGEXP_REPLACE(raw_name, ' {2,}', ' ')
WHERE id BETWEEN 1 AND 6;

-- 在当前事务中对照原值和清理值,HEX 帮助辨认不可见字符。
SELECT id, HEX(raw_name) AS raw_hex, HEX(clean_name) AS clean_hex
FROM space_cleanup_demo
ORDER BY id;

-- 示例撤销上述 UPDATE;真正保留更新需在确认后选择 COMMIT。
ROLLBACK;

实际集成可先把同样的表达式放到导入预览或展示层查询中。若最终要更新历史字段,应保留可恢复的原值、按主键范围分批,并考虑并发写入、唯一约束及锁等待。比如两个名称在清理后变成相同值,是否允许合并,属于业务规则,正则不会替你决定。

不要把示例的 id 范围换成一个没有限制的全表更新。大字段和大表上的正则计算需要安排负载;一次处理多少行,应根据实际执行情况和事务规模决定,本文没有虚构通用吞吐指标。

临时样本主键原始字段清理字段与事务的静态组成
结构说明图:主键关联 raw_name 与 clean_name,预览读取两者;事务中的更新只写 clean_name,保留原始字段用于比较。

制表符和换行也要清理时怎么办?

如果业务明确要求把各类空白都压成普通空格,可另行采用较宽的 [[:space:]]+。它的范围超出普通空格,可能把换行压掉,因此多行备注不应默认使用。

-- 仅在业务允许合并空白字符时预览此变体,不直接 UPDATE。
SELECT id,
       raw_name,
       TRIM(REGEXP_REPLACE(raw_name, '[[:space:]]+', ' ')) AS normalized_name
FROM space_cleanup_demo
ORDER BY id;

全角空格、不换行空格以及其他 Unicode 空白要按实际数据补样本,结合当前 MySQL 使用的 ICU 正则语义确认。不要把“视觉上为空白”直接等同于“模式一定覆盖”。如来源是二进制列,也不应假设正则能按普通字符列直接处理,应先确定其编码与字段类型。

只有首尾空格,用 TRIM 就够了吗?

是的,如果规则只要求去除首尾普通空格,直接用 TRIM 更清楚。它不会压缩字段中间的连续空格,也不应被当作删除所有 Unicode 空白的通用函数。

NULL 能顺便改为空字符串吗?

可以另加业务转换,但不建议无意中这样做。本项目保留 NULL;如需转换,先约定“缺失”和“空值”是否等价,并单独记录这条规则。

重复清理会一直改变结果吗?

在相同字符规则下,把连续普通空格压成一个具有幂等性,重复应用不会继续缩减已经留下的单空格。集成时可把这一点、NULL 保留、换行保留和首尾规则作为验收条件。对我来说,小型清理项目的完成标准是规则能被解释和复用,而不是字段看起来更整齐。

-- 结束独立示例后清理会话临时表。
DROP TEMPORARY TABLE space_cleanup_demo;

参考:MySQL 正则表达式与 REGEXP_REPLACE、字符串函数与 TRIM。

版本声明
本文转载于:17golang原创 如有侵犯,请联系study_golang@163.com删除
MySQL optimizer_switch derived_merge 怎样临时关闭派生表合并MySQL optimizer_switch derived_merge 怎样临时关闭派生表合并
上一篇
MySQL optimizer_switch derived_merge 怎样临时关闭派生表合并
MySQL 直方图统计信息怎样帮助优化器选择计划
下一篇
MySQL 直方图统计信息怎样帮助优化器选择计划
查看更多
最新文章
查看更多
课程推荐
  • 前端进阶之JavaScript设计模式
    前端进阶之JavaScript设计模式
    设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
    543次学习
  • GO语言核心编程课程
    GO语言核心编程课程
    本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
    516次学习
  • 简单聊聊mysql8与网络通信
    简单聊聊mysql8与网络通信
    如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
    500次学习
  • JavaScript正则表达式基础与实战
    JavaScript正则表达式基础与实战
    在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
    487次学习
  • 从零制作响应式网站—Grid布局
    从零制作响应式网站—Grid布局
    本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
    485次学习
查看更多
AI推荐
  • PubMedQA数据集详解:生物医学问答基准、功能与应用指南
    PubMedQA
    深入了解PubMedQA生物医学问答数据集,涵盖其核心功能、使用方法及在临床决策、药物研发等场景的应用,助力提升NLP模型性能。
    761次使用
  • H2O EvalGPT:开源LLM大模型评估与排行榜工具
    H2O EvalGPT
    H2O EvalGPT是H2O.ai推出的开源LLM评估平台,提供详细的大模型性能排行榜、行业特定基准测试及A/B测试功能,助您快速选择最适合项目的高性能大语言模型。
    758次使用
  • LMArena是什么?伯克利AI模型评估平台使用指南与功能解析
    LMArena
    LMArena是加州大学伯克利分校推出的AI模型匿名评测平台。通过盲测投票机制,用户可对比不同大模型回答并生成实时排行榜,助力开发者优化模型及用户选择最佳AI工具。
    842次使用
  • 斯坦福HELM:大语言模型Holistic Evaluation整体评估框架详解
    HELM
    深入了解斯坦福推出的HELM(Holistic Evaluation of Language Models)大模型评测体系。本文解析其核心功能、安装配置步骤及应用场景,涵盖准确性、公平性、鲁棒性等多维度指标,助力开发者全面优化语言模型性能。
    810次使用
  • MMBench详解:多模态大模型基准测试、功能特点与使用指南
    MMBench
    MMBench是由上海人工智能实验室等机构联合推出的多模态基准测试平台,提供细粒度能力评估、大规模数据集及VLMEvalKit工具。本文详细介绍其核心功能、安装使用方法及应用场景,助力开发者全面评估多模态模型性能。
    640次使用
微信登录更方便
  • 密码登录
  • 注册账号
登录即同意 用户协议 和 隐私政策
返回登录
  • 重置密码