欄位內容需批次替換特定字串 (如網域遷移、舊路徑清理) 時,REPLACE() 配合 UPDATE 可單條 SQL 完成,無需程式迴圈。
UPDATE table_name
SET column_name = REPLACE(column_name, 'old_string', 'new_string')
WHERE column_name LIKE '%old_string%'; -- 可選:縮小掃描範圍
-- MySQL
UPDATE t_newsinfo
SET content = REPLACE(content, 'https://admin.thinkall.net.cn/', 'https://admin.xkpx.com/');
-- SQL Server (大欄位需 CAST)
UPDATE t_newsinfo
SET [content] = REPLACE(CAST([content] AS VARCHAR(MAX)), 'https://admin.thinkall.net.cn/', 'https://admin.xkpx.com/');
-- PostgreSQL
UPDATE t_newsinfo
SET content = REPLACE(content, 'https://admin.thinkall.net.cn/', 'https://admin.xkpx.com/');
| 資料庫 | 大物件欄位 (TEXT/BLOB/CLOB) | 大小寫敏感 | 備註 |
|---|---|---|---|
| MySQL | 直接支援 | 視 Collation (_ci 不敏感) | InnoDB 8.0+ 可線上 DDL |
| SQL Server | 需 CAST(... AS VARCHAR(MAX)) | 視 Collation | REPLACE 不支援 TEXT/NTEXT 舊型別 |
| PostgreSQL | 直接支援 | 敏感 (可用 REPLACE + LOWER) | 支援正則 regexp_replace |
| Oracle | 需 TO_LOB 或 PL/SQL 迴圈 | 敏感 | 建議用 DBMS_LOB |
-- 避免長事務鎖表、Binlog 膨脹
DECLARE @batch INT = 10000;
WHILE 1=1
BEGIN
UPDATE TOP (@batch) t_newsinfo
SET content = REPLACE(content, 'old', 'new')
WHERE content LIKE '%old%';
IF @@ROWCOUNT < @batch BREAK;
WAITFOR DELAY '00:00:01'; -- 釋放鎖喘息
END
單條 UPDATE ... REPLACE 是批次字串清洗的利器,跨庫只需注意大欄位轉型與編碼一致性。