REPLACE 是什么
把字符串中所有出现的子串替换成新内容,是字面量替换而不是正则。常用于批量脱敏、清理固定后缀、统一格式。要注意它替换的是全部出现位置,想只替换第一处需要换用正则或应用层处理。
基本信息
| 语法 | REPLACE(str, from_str, to_str) |
|---|---|
| 匹配方式 | 逐字面匹配,替换全部出现位置 |
| 大小写 | MySQL 与 PostgreSQL 都区分大小写 |
| 正则替换 | 用 REGEXP_REPLACE,MySQL 8 与 PostgreSQL 都支持 |
| NULL 规则 | 任一参数为 NULL,结果为 NULL |
| 空 from_str | from_str 为空串时返回原字符串,不做替换 |
常见替换写法
常见替换写法
SELECT REPLACE('2024-01-02', '-', ''); -- '20240102'
SELECT REPLACE(' a b ', ' ', ''); -- 'ab':去掉全部半角空格
-- 批量清洗:先过滤再改,减少无谓写入与锁持有时间
UPDATE users
SET phone = REPLACE(phone, ' ', '')
WHERE phone LIKE '% %' AND phone IS NOT NULL;
-- 正则替换:注意两库默认行为不同
SELECT REGEXP_REPLACE('a-b-c', '-', '_'); -- MySQL 8:替换全部
SELECT regexp_replace('a-b-c', '-', '_', 'g'); -- PostgreSQL:加 g 才全局用法与边界
| 场景 | 写法 | 说明 |
|---|---|---|
| 去固定前缀 | REPLACE(s, 'http://', '') | 字面量匹配,语义明确 |
| 去全部空格 | REPLACE(s, ' ', '') | 只处理半角空格,制表符要另处理 |
| 脱敏替换 | REPLACE(s, mid, '****') | 会替换所有相同子串,注意范围 |
| 按模式替换 | REGEXP_REPLACE | 支持捕获组与全局标记 |
| 遇上 NULL | 整体返回 NULL | 批量更新前先过滤 |
典型使用场景
- 清洗导入数据里的空格与不可见字符
- 脱敏:把手机号中段、身份证中段替换成星号
- 统一 URL 前缀,便于比对与去重
- 清理数据里的固定后缀,例如测试环境标记
- 把全角标点批量换成半角
- 改写编码格式:去掉分隔符后再校验
- 合并多来源数据时统一表述,例如把“北京市”改成“北京”
- 修数据:把误写入的分隔符或占位符批量去掉
REPLACE 只做字面量匹配,不要指望它按模式工作:想删除所有数字或所有空白字符,要用 REGEXP_REPLACE('[0-9]+', '') 这类正则写法。
替换前后都可以先跑一遍 SELECT 对比样本:SELECT col, REPLACE(col, 'x', 'y') FROM t LIMIT 20,确认替换结果符合预期再执行 UPDATE,避免把脏数据改得更乱。
对索引列做批量 REPLACE 更新会让被改的行全部产生新版本、索引同步维护,一次改几百万行会长时间持锁并放大日志。按主键分批提交,并准备好回滚方案。