首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

MySQL 字串欄位指定位元對調技巧:CONCAT + SUBSTR 實現第 10、11 字元互換

     編輯:MySQL 資料庫相關知識

問題

表 t 欄位 c (字串型),需將第 10 與第 11 個字元 (1-based) 位置互換。

解法 (適用 ASCII/單位元組字元集)

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-...]

多位元組字元集 (UTF-8/GBK) 注意

  • 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);

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved