首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> MySQL 資料庫 >> MySQL 綜合教學

MySQL 字符串截取函數大全:LEFT、RIGHT、SUBSTRING_INDEX、SUBSTRING、TRIM 實戰用法與陷阱避坑

     編輯:MySQL 綜合教學

MySQL 字符串截取函數大全:LEFT、RIGHT、SUBSTRING_INDEX、SUBSTRING、TRIM 實戰用法與陷阱避坑

業務中常需從組合字段(如 主鍵A:主鍵B:主鍵C)提取特定段位進行關聯查詢。MySQL 提供豐富的字符串截取函數,但參數細節、負數語義、NULL 處理差異大。本文系統整理五大核心函數,附實戰示例與避坑指南。

1. LEFT(str, len) —— 從左側截取定長

SELECT LEFT('shinejaie', 5);  -- 'shine'
SELECT LEFT(col, 10) FROM t;  -- 列應用
-- 任一參數為 NULL → 返回 NULL
  • ✅ 簡單定長前綴提取。
  • ❌ 不支援按字符/字節切換,多字節字符按字節截取可能截半個字符(亂碼)。

2. RIGHT(str, len) —— 從右側截取定長

SELECT RIGHT('shinejaie', 4);  -- 'jaie'
-- NULL 傳遞規則同 LEFT

3. SUBSTRING_INDEX(str, delim, count) —— 按分隔符截取(最實用)

-- 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);
  • ✅ 分隔符可為多字符串,大小寫敏感。
  • ✅ 負數 count 從右向左,極適合取後綴/倒數第 N 段。

4. SUBSTRING / SUBSTR —— 通用位置長度截取(標準 SQL)

-- 從位置 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 在所有變體中均生效
  • ✅ 靈活控制起始位置與長度。
  • ⚠️ 位置從 1 開始,非 0;超出長度返回空串非 NULL。

5. TRIM([{BOTH|LEADING|TRAILING} [remstr] FROM] str) —— 去除前後綴

-- 默認去除兩側空格
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 / RIGHTSUBSTRING(str,1,len)多字節字符慎用
按分隔符取第 N 段/倒數第 N 段SUBSTRING_INDEXSUBSTRING + LOCATE 組合首選,性能最好
任意位置定長截取SUBSTRING(str, pos, len)SUBSTR標準 SQL,可移植
去除特定前後綴/空格TRIMREPLACE(str, 'x', '')TRIM 只能頭尾,中間用 REPLACE
提取域名/路徑/參數SUBSTRING_INDEX + SUBSTRINGREGEXP_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))
-- 需遞歸/存儲過程或應用層處理

避坑指南

  1. NULL 傳播:所有函數參數含 NULL → 結果 NULL,用 COALESCE(col, '') 防護。
  2. 字符集與字節:LEFT/RIGHT/SUBSTRING 按字節操作,UTF8MB4 下一漢字 3-4 字節,易截半字符。8.0+ 可用 SUBSTRING(str, pos, len) USING utf8mb4(實驗特性)或應用層處理。
  3. 分隔符不存在:SUBSTRING_INDEX 返回原串,非 NULL/空,邏輯判斷需注意。
  4. 性能:SUBSTRING_INDEX 內部優化優於多次 LOCATE + SUBSTRING;大表高頻調用考慮生成列/虛擬列持久化。

掌握這五大函數組合拳,90% 字符串截取需求無需正則、無需應用層處理,SQL 直出最高效。

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