表 t 欄位 c (字串型),需將第 10 與第 11 個字元 (1-based) 位置互換。
SET @pos1 = 10;
SET @pos2 = 11;
UPDATE t
SET c = CONCAT(
LEFT(c, @pos1 - 1), -- 第 1-9 字元
SUBSTR(c, @pos2, 1), -- 第 11 字元移到第 10 位
SUBSTR(c, @pos1 + 1, @pos2 - @pos1 - 1), -- 第 10-11 之間 (此處為空)
SUBSTR(c, @pos1, 1), -- 第 10 字元移到第 11 位
RIGHT(c, LENGTH(c) - @pos2) -- 第 12 字元之後
);
原始: [1-9] [10] [11] [12-...]
目標: [1-9] [11] [10] [12-...]
LEFT/RIGHT/SUBSTR 在 MySQL 中**按字元計算** (非位元組),UTF-8 中文佔 3 位元組但算 1 字元,**邏輯仍正確**。BINARY/BLOB 或使用 SUBSTRING(..., pos, 1) 在舊版可能按位元組,**需實測驗證**。SUBSTRING(c, 1, 9)、SUBSTRING(c, 11, 1)... 可讀性更高。CREATE FUNCTION swap_chars(str TEXT, pos1 INT, pos2 INT) RETURNS TEXT
DETERMINISTIC
BEGIN
IF pos1 > pos2 THEN
SET @tmp = pos1; SET pos1 = pos2; SET pos2 = @tmp;
END IF;
RETURN CONCAT(
SUBSTRING(str, 1, pos1 - 1),
SUBSTRING(str, pos2, 1),
SUBSTRING(str, pos1 + 1, pos2 - pos1 - 1),
SUBSTRING(str, pos1, 1),
SUBSTRING(str, pos2 + 1)
);
END;
使用:UPDATE t SET c = swap_chars(c, 10, 11);