核心截取函數對比
| 函數 | 語法 | 說明 |
| LEFT | LEFT(str, len) | 最左 len 字符 |
| RIGHT | RIGHT(str, len) | 最右 len 字符 |
| SUBSTRING | SUBSTRING(str, pos[, len]) | 從 pos 開始(1 起),長度 len;pos 可負(倒數) |
| SUBSTRING_INDEX | SUBSTRING_INDEX(str, delim, count) | 按分隔符 delim 第 count 次出現截取;count>0 取左,count<0 取右 |
| MID / SUBSTR | MID(str, pos, len) | SUBSTRING 別名,ANSI SQL92 標準 |
實戰示例(以 '111cn.net' 為例)
LEFT / RIGHT
SELECT LEFT('111cn.net', 3); -- '111'
SELECT RIGHT('111cn.net', 3); -- 'net'
SUBSTRING 位置與長度
SELECT SUBSTRING('111cn.net', 4); -- 'cn.net' (第4字符到末尾)
SELECT SUBSTRING('111cn.net', 4, 2); -- 'cn'
SELECT SUBSTRING('111cn.net', -4); -- '.net' (倒數4字符到末尾)
SELECT SUBSTRING('111cn.net', -4, 2); -- '.n' (倒數4字符起取2個)
-- 注意:len 不能為負
SUBSTRING_INDEX 分隔符截取
SELECT SUBSTRING_INDEX('www.111cn.net', '.', 2); -- 'www.111cn' (第2個.之前)
SELECT SUBSTRING_INDEX('www.111cn.net', '.', -2); -- '111cn.net' (倒數第2個.之後)
SELECT SUBSTRING_INDEX('www.111cn.net', '.coc', 1);-- 'www.111cn.net' (找不到分隔符返回原串)
去空格函數
LTRIM(str) -- 去左空格
RTRIM(str) -- 去右空格
TRIM([[BOTH|LEADING|TRAILING] [remstr] FROM] str) -- 通用去除,默認去兩端空格
SELECT TRIM(' bar '); -- 'bar'
SELECT TRIM(LEADING 'x' FROM 'xxxbarxxx'); -- 'barxxx'
SELECT TRIM(BOTH 'x' FROM 'xxxbarxxx'); -- 'bar'
SELECT TRIM(TRAILING 'xyz' FROM 'barxxyz'); -- 'barx'
性能與最佳實踐
- 大量截取操作建議在應用層完成,減少數據庫 CPU 壓力。
SUBSTRING_INDEX 解析 URL、域名、路徑極其高效。
- 避免在
WHERE 子句對大字段用函數(導致索引失效),改用 LIKE 'prefix%' 或全文索引。