業務常需批量清洗欄位文本:去除非法字符、統一格式、脫敏。應用層SELECT → str_replace → UPDATE極其低效。MySQL內建REPLACE()單條SQL原地完成,支援多詞同步、條件過濾,效能碾壓應用層迴圈。
-- 單詞替換
UPDATE `table` SET `field` = REPLACE(`field`, '舊字符', '新字符');
-- 多詞同步替換(鏈式調用)
UPDATE `table` SET
`field` = REPLACE(`field`, '舊1', '新1'),
`field` = REPLACE(`field`, '舊2', '新2'),
`field` = REPLACE(`field`, '舊3', '新3')
WHERE `condition` = 1;
UPDATE articles
SET content = REPLACE(content, 'https://old-domain.com', 'https://new-domain.com')
WHERE content LIKE '%old-domain.com%';
UPDATE users
SET phone = CONCAT(SUBSTRING(phone, 1, 3), '****', SUBSTRING(phone, 8, 4))
WHERE phone REGEXP '^1[3-9][0-9]{9}$';
注意:此處用CONCAT+SUBSTRING而非REPLACE,因需定位替換。
UPDATE products
SET description = REPLACE(description, '舊品牌', '新品牌'),
description = REPLACE(description, '舊型號', '新型號'),
description = REPLACE(description, '停產', '經典款')
WHERE category_id = 10;
| 維度 | 應用層循環 | MySQL REPLACE() |
|---|---|---|
| 網路往返 | N次 (N=行數) | 1次 |
| SQL解析優化 | N次 | 1次 |
| 事務開銷 | N次提交或大事務 | 1次隱式事務 |
| 鎖持有時間 | 長(逐行) | 短(批次) |
| 10萬行耗時 | 分鐘級 | 秒級 |
TEXT/BLOB用REPLACE會隱式轉換,極大值可能超max_allowed_packet,分批處理BEFORE/AFTER UPDATE觸發器,注意副作用SET sql_log_bin=0(需超權)SELECT REPLACE(...)預覽結果-- REGEXP_REPLACE 正則替換(8.0.4+)
UPDATE articles SET content = REGEXP_REPLACE(content, '', '')
WHERE content LIKE '%