MID() 函數 (SQL MID() Function)

MID() 函數是 MySQL 專用的字串擷取函數,功能與 SUBSTRING() 完全相同。用於從字串中擷取指定位置、指定長度的子字串

💡 建議: 為了跨資料庫相容性,建議優先使用 SUBSTRING() 而非 MID()

MID() 語法 (Syntax)

MID(string, start [, length])
  • string:原始字串或欄位名稱
  • start:起始位置 (從 1 開始計算)
  • length:要擷取的字元數 (可選,省略則擷取到結尾)

MID() 用法範例 (Example)

customers 資料表:

C_IdName
1Smith
2Brad

範例 1:擷取前兩個字元

SELECT Name, MID(Name, 1, 2) AS FirstTwo
FROM customers;

結果:

NameFirstTwo
SmithSm
BradBr

範例 2:從第 3 個字元開始擷取

SELECT Name, MID(Name, 3) AS FromThird
FROM customers;

結果:

NameFromThird
Smithith
Bradad

範例 3:擷取中間部分

SELECT MID('Hello World', 3, 5) AS Middle;
-- 結果:'llo W'

MID() 與 SUBSTRING() 的關係

在 MySQL 中,MID()SUBSTRING() 以及 SUBSTR() 功能完全相同:

-- 以下三個查詢結果相同 (MySQL)
SELECT MID('Hello', 1, 3);        -- 'Hel'
SELECT SUBSTRING('Hello', 1, 3); -- 'Hel'
SELECT SUBSTR('Hello', 1, 3);    -- 'Hel'

負數起始位置

MySQL 的 MID() 支援負數起始位置,表示從字串結尾開始計算:

SELECT MID('Hello World', -5, 5) AS LastFive;
-- 結果:'World'

SELECT MID('Hello World', -3) AS LastThree;
-- 結果:'rld'

實際應用範例

1. 擷取固定格式資料

-- 從產品代碼 'PRD-001-TW' 擷取各部分
SELECT
    product_code,
    MID(product_code, 1, 3) AS prefix,      -- 'PRD'
    MID(product_code, 5, 3) AS serial,      -- '001'
    MID(product_code, -2) AS country        -- 'TW'
FROM products;

2. 資料脫敏

-- 隱藏手機號碼中間 4 位
SELECT
    phone,
    CONCAT(
        MID(phone, 1, 4),
        '****',
        MID(phone, 9)
    ) AS masked_phone
FROM customers;
-- 結果:0912****567

3. 搭配 LENGTH() 使用

-- 取得除了最後 3 個字元以外的內容
SELECT MID(name, 1, LENGTH(name) - 3) AS trimmed
FROM products;

資料庫相容性

資料庫MID()替代方案
MySQLSUBSTRING()
SQL ServerSUBSTRING()
PostgreSQLSUBSTRING()
OracleSUBSTR()
SQLiteSUBSTR()

相關主題