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

MySQL 字符串截取函數大全:LEFT、RIGHT、SUBSTRING、SUBSTRING_INDEX 實戰指南

     編輯:MySQL 資料庫相關知識

核心函數速查表

函數語法說明示例結果
LEFTLEFT(str, len)從左側截取 len 字符LEFT('abcdef', 3)'abc'
RIGHTRIGHT(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_INDEXSUBSTRING_INDEX(str, delim, count)按分隔符 delim 截取,count>0 從左數,count<0 從右數SUBSTRING_INDEX('a.b.c', '.', 2)'a.b'
SUBSTRING_INDEX('a.b.c', '.', -1)'c'

詳細用法與場景

1. 固定長度截取:LEFT / RIGHT / SUBSTRING

-- 文章摘要:取前 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 為負數時,從末尾倒數。

2. 分隔符截取:SUBSTRING_INDEX(高頻實戰)

-- 域名解析:取主域名
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);

3. 標準 SQL 語法:FROM / FOR 關鍵字

-- 等價寫法
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。

方案:SUBSTRING_INDEX 拆分 + UNION/OR

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+,存儲佔用大新系統設計、半結構化數據

最佳實踐建議

  1. 優先規範化:多值字段違反 1NF,新系統設計時拆分關聯表或用 JSON。
  2. 簡單場景用 SQL:固定長度截取、單一分隔符提取,SUBSTRING_INDEX 極其高效。
  3. 複雜拆分移應用層:正則解析、不定長度分隔、需事務保證時,PHP/Python/Java 處理更靈活。
  4. 避免在 WHERE/JOIN 中對大表使用字符串函數:導致全表掃描,若必須用,考慮生成列 + 索引(MySQL 5.7+)。

函數參考手冊鏈接

官方文檔:String Functions and Operators

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