| 函數 | 語法 | 說明 | 示例 | 結果 |
|---|---|---|---|---|
| LEFT | LEFT(str, len) | 從左側截取 len 字符 | LEFT('abcdef', 3) | 'abc' |
| RIGHT | RIGHT(str, len) | 從右側截取 len 字符 | RIGHT('abcdef', 3) | 'def' |
| SUBSTRING (SUBSTR) | SUBSTRING(str, pos) | 從位置 pos 截取到結尾 | SUBSTRING('abcdef', 3) | 'cdef' |
| SUBSTRING(str, pos, len) | 從位置 pos 截取 len 字符 | SUBSTRING('abcdef', 2, 3) | 'bcd' | |
| SUBSTRING_INDEX | SUBSTRING_INDEX(str, delim, count) | 按分隔符 delim 截取,count>0 從左數,count<0 從右數 | SUBSTRING_INDEX('a.b.c', '.', 2) | 'a.b' |
| SUBSTRING_INDEX('a.b.c', '.', -1) | 'c' |
-- 文章摘要:取前 200 字符
SELECT LEFT(content, 200) AS abstract FROM articles;
-- 文件後綴:取最後 4 字符
SELECT RIGHT(filename, 4) AS ext FROM uploads;
-- 靈活截取:從第 5 個字符開始取 200 字符
SELECT SUBSTRING(content, 5, 200) AS abstract FROM articles;
-- 負數位置:從倒數第 5 個字符到結尾
SELECT SUBSTRING(content, -5) AS last_five FROM articles;
注意:MySQL 字符串位置從 1 開始;pos 為負數時,從末尾倒數。
-- 域名解析:取主域名
SELECT SUBSTRING_INDEX('blog.jb51.net', '.', 2); -- 'blog.jb51'
SELECT SUBSTRING_INDEX('blog.jb51.net', '.', -2); -- 'jb51.net'
-- 路徑處理:取文件名
SELECT SUBSTRING_INDEX('/var/www/html/index.php', '/', -1); -- 'index.php'
-- 多值字段拆分:配合數字表/遞歸 CTE 實現行轉列(MySQL 8.0+)
WITH RECURSIVE nums(n) AS (
SELECT 1 UNION ALL SELECT n+1 FROM nums WHERE n < 10
)
SELECT SUBSTRING_INDEX(SUBSTRING_INDEX('1,2,3,4', ',', n), ',', -1) AS val
FROM nums
WHERE n <= (LENGTH('1,2,3,4') - LENGTH(REPLACE('1,2,3,4', ',', '')) + 1);
-- 等價寫法
SUBSTRING(str FROM pos) -- = SUBSTRING(str, pos)
SUBSTRING(str FROM pos FOR len) -- = SUBSTRING(str, pos, len)
-- 標準語法可移植性更強,建議跨數據庫項目使用
場景:user.jlid 存儲 '1,2',需關聯 jl 表查詢 ID 為 1 和 2 的記錄。
錯誤嘗試:WHERE jl.id IN (SELECT jlid FROM user WHERE id=1) → 字符串 '1,2' 不會自動拆分,僅匹配 ID=1。
SELECT * FROM jl WHERE id = (
SELECT SUBSTRING_INDEX(SUBSTRING_INDEX(jlid, ',', 1), ',', -1) FROM user WHERE id=1
)
UNION ALL
SELECT * FROM jl WHERE id = (
SELECT SUBSTRING_INDEX(SUBSTRING_INDEX(jlid, ',', 2), ',', -1) FROM user WHERE id=1
);
通用拆分第 N 段:SUBSTRING_INDEX(SUBSTRING_INDEX(str, delim, n), delim, -1)
| 方案 | 優點 | 缺點 | 建議場景 |
|---|---|---|---|
| MySQL 字符串函數 | 純 SQL,無需應用層參與,網絡傳輸少 | 複雜拆分 SQL 難維護,無法使用索引 | 簡單截取、臨時查詢、數據清洗 |
| 應用層拆分 | 代碼可讀性強,可緩存拆分結果,支持複雜邏輯 | 多一次網絡交互,數據傳輸量大 | 高頻業務、複雜解析、需事務一致性 |
| JSON 字段 | 原生支持數組操作,可建索引 | MySQL 5.7+,存儲佔用大 | 新系統設計、半結構化數據 |
SUBSTRING_INDEX 極其高效。