萬盛學電腦網

您现在的位置: 萬盛學電腦網 >> 程式設計 >  >> 資料庫 >> MySQL 教學

MySQL REPLACE 函数深度解析:字符串替换、截取与定位组合实战

语法速查

REPLACE(str, from_str, to_str)
-- 返回将 str 中所有 from_str 替换为 to_str 后的字符串

典型应用场景

场景一:全表字段值替换

UPDATE b_blog
SET content = REPLACE(content, 'www.111cn.net', 'm.111cn.net')
WHERE id = 9;

场景二:结合 SUBSTRING + LOCATE 删除特定标记块

需求:清理 message 字段中从 [b][url] [img] 到 [/url][/b] 的整段内容。

UPDATE b_blog
SET message = REPLACE(
    message,
    SUBSTRING(
        message,
        LOCATE('[b][url] [img]', message),
        LOCATE('[/url][/b]', message) + 10 - LOCATE('[b][url] [img]', message)
    ),
    ''
)
WHERE id >= 10000;

核心辅助函数详解

SUBSTRING(str, pos, len)

  • pos:起始位置(1-based),负数表示从末尾倒数。
  • len:长度,可选,省略则截至末尾。
  • 示例:SUBSTRING('blog.fity.cn', 6, 4) → 'fity'

LOCATE(substr, str [, pos])

  • 返回 substr 在 str 中首次出现的位置(1-based),不存在返回 0。
  • 支持中文,不区分大小写。
  • 可选 pos 指定搜索起始位置。
  • 示例:LOCATE('fity', 'blog.fity.cn') → 6

进阶技巧

批量替换多个关键词

UPDATE articles
SET content = REPLACE(
    REPLACE(
        REPLACE(content, 'old1', 'new1'),
    'old2', 'new2'),
'old3', 'new3');

替换后去除多余空格

UPDATE posts
SET content = TRIM(REPLACE(content, '  ', ' '))
WHERE content LIKE '%  %';

配合正则定位(MySQL 8.0+)

UPDATE logs
SET message = REPLACE(message, SUBSTRING(message, LOCATE('[ERROR]', message), 50), '[REDACTED]')
WHERE message REGEXP '\\[ERROR\\]';

性能与陷阱

  • REPLACE 会全表扫描,大表建议分批次(LIMIT + WHERE id > last_id)执行。
  • 替换前务必 SELECT 预览受影响行,确认无误再 UPDATE。
  • 事务包裹:START TRANSACTION; ... COMMIT/ROLLBACK; 保证原子性。
copyright © 萬盛學電腦網 all rights reserved