REPLACE(str, from_str, to_str)
-- 返回將 str 中所有 from_str 替換為 to_str 後的新字符串
from_str 不能為空字符串 (返回原值)。REGEXP_REPLACE (MySQL 8.0+)。UPDATE table_name
SET column_name = REPLACE(column_name, 'old_text', 'new_text')
WHERE column_name LIKE '%old_text%';
WHERE 子句可利用索引快速定位需更新行,避免全表掃描。
CREATE TABLE `test` (
`id` INT(4) NOT NULL AUTO_INCREMENT,
`url` VARCHAR(50) NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM;
INSERT INTO `test` (`url`) VALUES
('www.1aa.cm'), ('www.1aa.cm'), ('www.1aa.cm'), ('www.1aa.cm'),
('www.bKjia.c0m'), ('www.bKjia.c0m');
<?php
$mysqli = new mysqli('127.0.0.1', 'root', 'root', 'cnnet');
if ($mysqli->connect_errno) die('Connect Error: ' . $mysqli->connect_error);
$old = '1aa.cm';
$new = 'bKjia.c0m';
// 1. 預覽受影響行
$preview = $mysqli->query("SELECT id, url FROM test WHERE url LIKE '%$old%'");
echo "將更新 {$preview->num_rows} 行:\n";
while ($row = $preview->fetch_assoc()) {
echo "ID {$row['id']}: {$row['url']}\n";
}
// 2. 執行替換
$sql = "UPDATE test SET url = REPLACE(url, ?, ?) WHERE url LIKE ?";
$stmt = $mysqli->prepare($sql);
$like = "%$old%";
$stmt->bind_param('sss', $old, $new, $like);
$stmt->execute();
echo "實際更新行數: {$stmt->affected_rows}\n";
// 3. 驗證結果
$result = $mysqli->query("SELECT url FROM test");
while ($row = $result->fetch_assoc()) {
echo $row['url'] . "\n";
}
?>
將更新 4 行:
ID 1: www.1aa.cm
ID 2: www.1aa.cm
ID 3: www.1aa.cm
ID 4: www.1aa.cm
實際更新行數: 4
www.bKjia.c0m
www.bKjia.c0m
www.bKjia.c0m
www.bKjia.c0m
www.bKjia.c0m
www.bKjia.c0m
| 場景 | SQL 寫法 |
|---|---|
| 多次替換鏈式 | REPLACE(REPLACE(col, 'a', 'b'), 'c', 'd') |
| 替換首次出現 | CONCAT(SUBSTRING_INDEX(col, 'old', 1), 'new', SUBSTRING(col, LOCATE('old', col) + LENGTH('old'))) |
| 替換最後一次 | 類似邏輯用 SUBSTRING_INDEX(..., -1) |
| 條件替換 (CASE) | CASE WHEN col LIKE '%A%' THEN REPLACE(col,'A','B') ELSE col END |
WHERE id BETWEEN start AND end LIMIT 1000 循環提交。CREATE TABLE test_bak AS SELECT * FROM test;。bind_param) 防注入。REPAIR TABLE 重建索引 (MyISAM)。