首页/数据/SQL 速查/REPLACE 字符串替换
函数速查60 条

REPLACE 字符串替换

把出现的所有子串替换为新内容:字面量替换、区分大小写、不支持正则;批量脱敏、清理固定后缀时高频使用。

SQL 速查数据更新于 2026-10-13

REPLACE 是什么

把字符串中所有出现的子串替换成新内容,是字面量替换而不是正则。常用于批量脱敏、清理固定后缀、统一格式。要注意它替换的是全部出现位置,想只替换第一处需要换用正则或应用层处理。

基本信息

语法REPLACE(str, from_str, to_str)
匹配方式逐字面匹配,替换全部出现位置
大小写MySQL 与 PostgreSQL 都区分大小写
正则替换用 REGEXP_REPLACE,MySQL 8 与 PostgreSQL 都支持
NULL 规则任一参数为 NULL,结果为 NULL
空 from_strfrom_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 更新会让被改的行全部产生新版本、索引同步维护,一次改几百万行会长时间持锁并放大日志。按主键分批提交,并准备好回滚方案。

易错点

  • 想只替换第一处却用了 REPLACE:它替换所有出现位置,需要按位置控制时改用正则或应用层
  • 忽略 NULL 规则:任一参数为 NULL 结果就是 NULL,批量替换前先过滤 IS NOT NULL
  • 大表一次性 UPDATE REPLACE:事务过大、锁时间过长,应按主键分批
  • 以为不区分大小写:REPLACE 区分大小写,需要忽略大小写时用正则的不敏感选项

数据来源与参考

  • MySQL 8.0 Reference Manual · REPLACE
  • PostgreSQL Documentation · String Functions and Operators
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌