mysql清除所有空格唯一可靠方案是replace()函数,因其仅处理ascii空格,清除制表符、换行符等需多层嵌套replace()叠加char(9/10/13),trim()仅去首尾无效于中间及特殊空白符。

MySQL 里不能用正则清除所有空格,REPLACE() 是唯一可靠方案
MySQL 原生不支持用正则批量替换空格(比如 REGEXP_REPLACE() 在 8.0+ 才有,且默认不启用或需额外配置)。多数生产环境仍跑在 5.7 或未开启正则模块,强行用会报错 FUNCTION xxx.REGEXP_REPLACE does not exist。所以别被 JS 或 Python 的写法带偏——MySQL 清除「所有空格」必须靠 REPLACE()。
REPLACE(str, ' ', '') 能清掉哪些空格?
这个函数只替换 ASCII 空格字符(U+0020),也就是你键盘按空格键打出来的那个。它对其他空白符完全无效:
- 制表符
\t(CHAR(9))不会被清除 - 换行符
\n(CHAR(10))和回车符\r(CHAR(13))也不会动 - 全角空格、不间断空格(
)、零宽空格等更不可能识别
如果字段里混了这些,单靠一次 REPLACE(content, ' ', '') 会漏掉大量“看不见的空格”。
想清干净所有空白符,得叠加多次 REPLACE()
MySQL 没有循环或正则,只能手动嵌套。常见组合如下:
SELECT REPLACE(
REPLACE(
REPLACE(
REPLACE('hello\tworld\n\r ', ' ', ''),
CHAR(9), ''
),
CHAR(10), ''
),
CHAR(13), ''
) AS cleaned;
实际更新字段时也得照搬这层套娃结构:
- 先确认字段里到底有哪些空白符:
SELECT HEX(content) FROM table WHERE id = 123;看输出里有没有09(tab)、0A(LF)、0D(CR) - 只含普通空格就用一层
REPLACE();含 tab 就加一层;含换行/回车再各加一层 - 嵌套太多会影响性能,大表慎用;建议先在小范围测试,再加
WHERE条件限制影响行数
别把 TRIM() 当成万能药
TRIM() 只处理首尾,中间空格纹丝不动。常见误用场景:
- 用户输入昵称存了
' 张 三 ',用TRIM(nickname)更新后变成'张 三'—— 中间两个空格还在 - 导出 CSV 再导入时字段带 tab 分隔符,
TRIM()对\t完全无感 - 想用
TRIM(BOTH FROM str)清所有空格?不行,BOTH仅控制方向,不改变匹配逻辑
真正要“彻底清空格”,从一开始就得明确:是只要视觉上连续显示为空白,还是必须字节级归零。后者永远绕不开多层 REPLACE()。











