一、SUBSTRING:靈活截取子字串
-- 從第 9 字元截取到結尾
SUBSTRING(commentid, 9)
-- 完整語法:SUBSTRING(str, pos[, len])
-- pos 為正:從左往右數;為負:從右往左數(倒數)
-- len 省略則截取到結尾
範例:SUBSTRING('content_13-11220-1', 9) → '13-11220-1'
二、SUBSTRING_INDEX:依分隔符拆分並取段
SUBSTRING_INDEX(str, delim, count)
-- count > 0:從左往右,取第 count 個分隔符之前的所有內容
-- count < 0:從右往左,取倒數第 |count| 個分隔符之後的所有內容
實戰範例:字串 'c-11065-50'
| 目標 | SQL | 結果 |
取最後一段 50 | SUBSTRING_INDEX(str, '-', -1) | 50 |
取中間段 11065 | SUBSTRING_INDEX(SUBSTRING_INDEX(str, '-', -2), '-', 1) | 11065 |
| 同樣取中間段(另寫法) | SUBSTRING_INDEX(SUBSTRING_INDEX(str, '-', 2), '-', -1) | 11065 |
進階組合:從 'content_13-11220-1' 取出 13
-- 寫法 A:三層巢狀(較慢)
SUBSTRING_INDEX(SUBSTRING_INDEX(SUBSTRING(commentid, 9), '-', 1), '-', -1)
-- 寫法 B:兩層巢狀(推薦,效能較好)
SUBSTRING_INDEX(SUBSTRING_INDEX(commentid, '-', 1), '_', -1)
-- 邏輯:先按 '-' 取第一段 'content_13',再按 '_' 取最後段 '13'
三、效能優化提示
- 大數據量下,減少函數巢狀層數 可顯著降低 CPU 開銷。
- 若頻繁在 WHERE/ORDER BY 中使用,建議新增虛擬欄位 或 生成列 並建索引(MySQL 5.7+)。
- 避免在 WHERE 條件對欄位做函數運算,導致索引失效。
四、常用字串函數速查
| 函數 | 用途 |
| LEFT(str, len) / RIGHT(str, len) | 左/右定長截取 |
| LOCATE(substr, str[, pos]) | 尋找子字串位置 |
| REPLACE(str, from, to) | 替換字串 |
| TRIM([BOTH|LEADING|TRAILING] rem FROM str) | 去除空白/指定字元 |