函數速查表
| 函數 | 語法 | 說明 |
| LEFT | LEFT(str, len) | 從左側截取 len 字元 |
| RIGHT | RIGHT(str, len) | 從右側截取 len 字元 |
| SUBSTRING | SUBSTRING(str, pos[, len]) | 從位置 pos 開始截取 len 字元,pos 可為負數(從右數) |
| SUBSTRING_INDEX | SUBSTRING_INDEX(str, delim, count) | 按分隔符 delim 截取第 count 次出現前/後的子串,count>0 取左邊,count<0 取右邊 |
詳細範例
1. LEFT(str, len)
SELECT LEFT('111cn.net', 3); -- '111'
2. RIGHT(str, len)
SELECT RIGHT('111cn.net', 3); -- 'net'
3. SUBSTRING(str, pos[, len])
-- 從第 4 字元開始到結束
SELECT SUBSTRING('111cn.net', 4); -- 'cn.net'
-- 從第 4 字元開始取 2 字元
SELECT SUBSTRING('111cn.net', 4, 2); -- 'cn'
-- 從倒數第 4 字元開始到結束
SELECT SUBSTRING('111cn.net', -4); -- '.net'
-- 從倒數第 4 字元開始取 2 字元
SELECT SUBSTRING('111cn.net', -4, 2); -- '.n'
-- 注意:len 不能為負數
4. SUBSTRING_INDEX(str, delim, count)
-- 取第 2 個 '.' 之前的部分
SELECT SUBSTRING_INDEX('www.111cn.net', '.', 2); -- 'www.111cn'
-- 取最後一個 '.coc' 之前的部分(找不到分隔符返回整串)
SELECT SUBSTRING_INDEX('www.111cn.net', '.coc', 1); -- 'www.111cn.net'
-- 負數 count:從右側計數
SELECT SUBSTRING_INDEX('www.111cn.net', '.', -1); -- 'net'
SELECT SUBSTRING_INDEX('www.111cn.net', '.', -2); -- '111cn.net'
進階組合技巧
取域名主體(去 www. 和 尾綴)
SELECT SUBSTRING_INDEX(SUBSTRING_INDEX('www.111cn.net', '.', 2), '.', -1); -- '111cn'
解析 URL 路徑最後一段
SELECT SUBSTRING_INDEX('https://example.com/path/to/file.html', '/', -1); -- 'file.html'
配合 REPLACE 清理後再截取
SELECT SUBSTRING_INDEX(REPLACE(url, 'https://', ''), '/', 1) FROM logs; -- 取域名
效能與注意事項
- 所有函數均為字元級操作,多位元組字元集(UTF-8)下正確按字元計算
- 大量資料處理時,避免在
WHERE 條件中對大欄位使用這些函數(導致全表掃描),改用應用層處理或建立函數索引 (MySQL 8.0+)
SUBSTRING_INDEX 若分隔符不存在,count>0 返回整串,count<0 返回空串