MID() 函數 (SQL MID() Function)
MID() 函數是 MySQL 專用的字串擷取函數,功能與 SUBSTRING() 完全相同。用於從字串中擷取指定位置、指定長度的子字串。
💡 建議: 為了跨資料庫相容性,建議優先使用
SUBSTRING()而非MID()。
MID() 語法 (Syntax)
MID(string, start [, length])
string:原始字串或欄位名稱start:起始位置 (從 1 開始計算)length:要擷取的字元數 (可選,省略則擷取到結尾)
MID() 用法範例 (Example)
customers 資料表:
| C_Id | Name |
|---|---|
| 1 | Smith |
| 2 | Brad |
範例 1:擷取前兩個字元
SELECT Name, MID(Name, 1, 2) AS FirstTwo
FROM customers;
結果:
| Name | FirstTwo |
|---|---|
| Smith | Sm |
| Brad | Br |
範例 2:從第 3 個字元開始擷取
SELECT Name, MID(Name, 3) AS FromThird
FROM customers;
結果:
| Name | FromThird |
|---|---|
| Smith | ith |
| Brad | ad |
範例 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() | 替代方案 |
|---|---|---|
| MySQL | ✅ | SUBSTRING() |
| SQL Server | ❌ | SUBSTRING() |
| PostgreSQL | ❌ | SUBSTRING() |
| Oracle | ❌ | SUBSTR() |
| SQLite | ❌ | SUBSTR() |
相關主題
- SUBSTRING() - 標準子字串函數
- LEFT() / RIGHT() - 取得左/右側字元
- LENGTH() - 取得字串長度