業務中常需從組合字段(如 主鍵A:主鍵B:主鍵C)提取特定段位進行關聯查詢。MySQL 提供豐富的字符串截取函數,但參數細節、負數語義、NULL 處理差異大。本文系統整理五大核心函數,附實戰示例與避坑指南。
SELECT LEFT('shinejaie', 5); -- 'shine'
SELECT LEFT(col, 10) FROM t; -- 列應用
-- 任一參數為 NULL → 返回 NULL
SELECT RIGHT('shinejaie', 4); -- 'jaie'
-- NULL 傳遞規則同 LEFT
-- count > 0:從左數第 count 個分隔符左側所有內容
SELECT SUBSTRING_INDEX('home.cnblogs.com', '.', 2); -- 'home.cnblogs'
-- count < 0:從右數第 |count| 個分隔符右側所有內容
SELECT SUBSTRING_INDEX('home.cnblogs.com', '.', -1); -- 'com'
-- 分隔符不存在 → 返回整個字符串
SELECT SUBSTRING_INDEX('home.cnblogs.com', '/', 2); -- 'home.cnblogs.com'
-- 實戰:提取組合鍵中間段
-- col = '1001:2002:3003' 取中間 2002
SELECT SUBSTRING_INDEX(SUBSTRING_INDEX(col, ':', 2), ':', -1);
-- 從位置 pos 開始到末尾(pos 從 1 開始)
SELECT SUBSTRING('shinejaie', 6); -- 'jaie'
SELECT SUBSTR('shinejaie' FROM 6); -- 標準 SQL 寫法
-- 從位置 pos 開始截取 len 長度
SELECT SUBSTRING('shinejaie', 6, 4); -- 'jaie'
SELECT SUBSTRING('shinejaie' FROM 6 FOR 4);
-- 負數 pos:從右向左數位置
SELECT SUBSTRING('shinejaie', -9, 5); -- 'shine' (倒數第9位開始取5個)
-- 注意:負數 pos 在所有變體中均生效
-- 默認去除兩側空格
SELECT TRIM(' shinejaie '); -- 'shinejaie'
-- 指定去除字符/字符串
SELECT TRIM(LEADING 'cn_' FROM 'cn_shinejaiecn_'); -- 'shinejaiecn_'
SELECT TRIM(BOTH 'cn_' FROM 'cn_shinejaiecn_'); -- 'shinejaie'
SELECT TRIM(TRAILING 'cn_' FROM 'cn_shinejaiecn_'); -- 'cn_shinejaie'
-- remstr 可選,默認空格;BOTH/LEADING/TRAILING 默認 BOTH
| 需求 | 推薦函數 | 備選 | 注意 |
|---|---|---|---|
| 固定長度前綴/後綴 | LEFT / RIGHT | SUBSTRING(str,1,len) | 多字節字符慎用 |
| 按分隔符取第 N 段/倒數第 N 段 | SUBSTRING_INDEX | SUBSTRING + LOCATE 組合 | 首選,性能最好 |
| 任意位置定長截取 | SUBSTRING(str, pos, len) | SUBSTR | 標準 SQL,可移植 |
| 去除特定前後綴/空格 | TRIM | REPLACE(str, 'x', '') | TRIM 只能頭尾,中間用 REPLACE |
| 提取域名/路徑/參數 | SUBSTRING_INDEX + SUBSTRING | REGEXP_SUBSTR (8.0+) | 組合拳最強 |
-- URL 解析:'https://www.example.com/path?k=v' SELECT SUBSTRING_INDEX(SUBSTRING_INDEX(url, '://', -1), '/', 1) AS domain, -- www.example.com SUBSTRING_INDEX(SUBSTRING_INDEX(url, '?', -1), '&', 1) AS first_param; -- k=v -- 組合鍵 '1001:2002:3003' 取中間 SELECT SUBSTRING_INDEX(SUBSTRING_INDEX(comb_key, ':', 2), ':', -1); -- 2002 -- 修剪字符串兩側指定字符集(MySQL 無內置 TRIM(charset)) -- 需遞歸/存儲過程或應用層處理
COALESCE(col, '') 防護。LEFT/RIGHT/SUBSTRING 按字節操作,UTF8MB4 下一漢字 3-4 字節,易截半字符。8.0+ 可用 SUBSTRING(str, pos, len) USING utf8mb4(實驗特性)或應用層處理。SUBSTRING_INDEX 返回原串,非 NULL/空,邏輯判斷需注意。SUBSTRING_INDEX 內部優化優於多次 LOCATE + SUBSTRING;大表高頻調用考慮生成列/虛擬列持久化。掌握這五大函數組合拳,90% 字符串截取需求無需正則、無需應用層處理,SQL 直出最高效。