首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> MySQL 資料庫 >> MySQL 綜合教學

MySQL REPLACE 函數實戰:批量替換字段中指定字符串 (如清洗采集標題垃圾標籤)

     編輯:MySQL 綜合教學

核心語法

UPDATE table_name 
SET column_name = REPLACE(column_name, 'old_substring', 'new_substring')
WHERE column_name LIKE '%old_substring%'; -- 建議加 WHERE 減少無意義更新

實戰案例:清洗采集文章標題中的垃圾圖片標籤

采集數據標題含垃圾片段:<img src="images/awwor.gif">,導致前端顯示異常。需批量清除。

UPDATE `article` 
SET `title` = REPLACE(`title`, '<img src="images/awwor.gif">', '')
WHERE `title` LIKE '%<img src="images/awwor.gif">%';

執行效果驗證

-- 1. 預覽影響範圍
SELECT COUNT(*) FROM `article` WHERE `title` LIKE '%<img src="images/awwor.gif">%';

-- 2. 預覽替換後樣本
SELECT `title` AS old_title, 
       REPLACE(`title`, '<img src="images/awwor.gif">', '') AS new_title
FROM `article` 
WHERE `title` LIKE '%<img src="images/awwor.gif">%' LIMIT 10;

-- 3. 事務包裹執行 (生產環境)
START TRANSACTION;
UPDATE `article` SET `title` = REPLACE(`title`, '<img src="images/awwor.gif">', '') WHERE `title` LIKE '%...%';
-- 檢查 ROW_COUNT() 是否符合預期
COMMIT; -- 或 ROLLBACK;

REPLACE 進階用法

1. 多重嵌套替換 (鏈式清洗)

UPDATE `content` 
SET `body` = REPLACE(REPLACE(REPLACE(`body`, '<script>', ''), '</script>', ''), '<iframe>', '')
WHERE `body` LIKE '%<script>%' OR `body` LIKE '%<iframe>%';

2. 配合正則邊界 (MySQL 8.0 REGEXP_REPLACE)

-- 僅替換完整標籤,避免誤傷相似文本
UPDATE `article` 
SET `title` = REGEXP_REPLACE(`title`, '<img\s+src=["\']images/awwor\.gif["\']\s*/?>', '')
WHERE `title` REGEXP '<img\s+src=["\']images/awwor\.gif["\']\s*/?>';

3. 替換後同步更新搜索向量/緩存

UPDATE `article` 
SET `title` = REPLACE(`title`, 'old', 'new'),
    `title_search_vector` = REPLACE(`title_search_vector`, 'old', 'new'), -- 若有全文搜索向量列
    `updated_at` = NOW()
WHERE `title` LIKE '%old%';

性能與避坑指南

問題原因解決
全表掃描慢無 WHERE 或 LIKE '%...%' 不走索引加 WHERE 過濾;全文索引 MATCH...AGAINST;分批次更新 (LIMIT 1000 循環)
誤替換 (如替換 'a' 導致 'abc' 變 'bc')REPLACE 是**全局子串替換**,無單詞邊界概念盡量精確匹配長子串;8.0 用 REGEXP_REPLACE 加邊界 \b
觸發器/外鍵級聯放大影響更新觸發關聯表操作評估影響範圍;必要時暫停觸發器 SET FOREIGN_KEY_CHECKS=0 (極慎重)
主從延遲大量更新產生巨大 Binlog分批次、低峰期執行;SET sql_log_bin=0 (僅當前會話不記 Binlog,極慎重)

總結

  1. REPLACE(str, from, to) 是 MySQL 最高效的**全量子串替換**工具。
  2. **必加 WHERE 過濾**,預覽樣本,事務包裹,生產環境分批執行。
  3. 複雜模式替換升級 MySQL 8.0 使用 REGEXP_REPLACE。
  4. 采集清洗、數據遷移、敏感詞過濾、編碼修復等場景極其實用。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved