MySQL REPLACE() 僅支援字面替換,若需「符合正則模式的行才替換」,可結合 WHERE column REGEXP 'pattern' 實現條件式批量替換。本文說明語法結構、實戰範例、前綴匹配技巧與效能注意事項。
UPDATE table_name
SET column_name = REPLACE(column_name, '搜尋字串', '替換字串')
WHERE column_name REGEXP '正則模式';
UPDATE test
SET url = REPLACE(url, 'test', 'abc')
WHERE url REGEXP 'www\\.test\\.com';
-- 僅針對包含 www.test.com 的行,將其中的 'test' 替換為 'abc'
UPDATE test
SET url = REPLACE(url, 'test', 'abc')
WHERE url REGEXP '^(www\\.test)';
-- ^ 定位開頭,匹配 www.test 開頭的所有變體
-- 依序執行
UPDATE test SET url = REPLACE(url, 'old1', 'new1') WHERE url REGEXP 'old1';
UPDATE test SET url = REPLACE(url, 'old2', 'new2') WHERE url REGEXP 'old2';
| 模式 | 含義 | 範例匹配 |
|---|---|---|
^abc | 以 abc 開頭 | abc, abc123 |
abc$ | 以 abc 結尾 | abc, 123abc |
abc | 包含 abc | abc, xabcy |
[abc] | 包含 a 或 b 或 c | a, b, c, ax |
[a-z] | 任一小寫字母 | a, b, z |
.* | 任意字元 (含空) | 所有字串 |
.+ | 任意字元 (至少一個) | 非空字串 |
\\. | 字面點號 | www.test.com |
WHERE id BETWEEN ... 或其他有索引條件縮小範圍。LIMIT 1000 迴圈執行,避免長鎖表。SELECT * FROM table WHERE col REGEXP 'pattern' LIMIT 10 確認匹配正確。REGEXP_REPLACE() (需支援),單條 SQL 完成正則替換。REPLACE() + WHERE REGEXP。結合 REGEXP 條件與 REPLACE() 字面替換,能解決 80% 批量清洗需求;其餘 20% 複雜場景,果斷下沉應用層,才是穩健工程選擇。