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

MySQL 字符串函數大全:20+ 高頻函數實戰詳解與避坑指南

     編輯:MySQL 綜合教學

字符串處理是 SQL 業務邏輯的核心環節。MySQL 提供豐富的內建字符串函數,涵蓋長度計算、填充裁剪、截取拼接、大小寫轉換、編碼查詢、搜尋替換等場景。本文精選 20+ 高頻函數,附帶實測案例、效能提示與常見陷阱,助你寫出簡潔高效的 SQL。

長度與編碼類

函數說明範例結果
LENGTH(str)返回字節長度(多位元組字元計多字節)LENGTH('中文')6 (UTF-8)
CHAR_LENGTH(str)返回字元長度(推薦用於業務邏輯)CHAR_LENGTH('中文')2
ASCII(str)返回最左字元 ASCII 碼ASCII('Abc')65
ORD(str)返回最左字元編碼(多位元組支援)ORD('中')20013
避坑:LENGTH 受字符集影響,同一字串在 utf8mb4 下比 latin1 長。業務邏輯(如驗證手機號長度)務必用 CHAR_LENGTH。

填充與裁剪類

-- 左/右填充至指定長度
SELECT RPAD('id', 10, '0');  -- 'id00000000'
SELECT LPAD('id', 10, '0');  -- '00000000id'

-- 裁剪空白或指定字元
SELECT TRIM('  hello  ');           -- 'hello'
SELECT LTRIM('  hello');            -- 'hello'
SELECT RTRIM('hello  ');            -- 'hello'
SELECT TRIM(BOTH 'x' FROM 'xxhelloxx'); -- 'hello'
SELECT TRIM(LEADING 'x' FROM 'xxhello'); -- 'hello'
SELECT TRIM(TRAILING 'x' FROM 'helloxx'); -- 'hello'

SPACE(n):快速生成 n 個空格,常用於格式化輸出。

截取與定位類

函數語法說明關鍵點
LEFTLEFT(str, len)左側起取 len 字元len 超過長度返回全串
RIGHTRIGHT(str, len)右側起取 len 字元同上
SUBSTRINGSUBSTRING(str, pos, len)從 pos 起取 len 字元pos 從 1 開始,非 0
LOCATELOCATE(substr, str, [start])查找子串首次出現位置不存在返回 0;區分大小寫取決於校對規則
FIND_IN_SETFIND_IN_SET(str, strlist)在逗號分隔集合中查找返回集合索引(從 1 起),不存在返回 0

拼接與構造類

-- 基礎拼接(任一參數為 NULL 結果為 NULL)
SELECT CONCAT('a', 'b', NULL);  -- NULL

-- 帶分隔符拼接(自動跳過 NULL)
SELECT CONCAT_WS(',', 'a', NULL, 'c');  -- 'a,c'

-- 重複字串
SELECT REPEAT('ab', 3);  -- 'ababab'

-- 反轉字串
SELECT REVERSE('mysql');  -- 'lqsym'

-- 插入替換(從 pos 起替換 len 字元)
SELECT INSERT('abcdef', 2, 3, 'XXX');  -- 'aXXXef'

大小寫與比較類

SELECT UPPER('abc'), LOWER('ABC');  -- 'ABC', 'abc'
SELECT STRCMP('a', 'b');  -- -1 (a

進階替換與轉換

-- 簡單替換
SELECT REPLACE('I like cat', 'cat', 'dog');  -- 'I like dog'

-- 進制轉換
SELECT HEX(255);      -- 'FF'
SELECT UNHEX('FF');   -- 0xFF (二進制)
SELECT CONV('1010', 2, 10);  -- '10' (二進制轉十進制)
SELECT BIN(10);       -- '1010'
SELECT OCT(10);       -- '12'

實戰場景範例

1. 手機號碼脫敏(中間 4 位替換為 *)

SELECT CONCAT(LEFT(phone, 3), '****', RIGHT(phone, 4)) AS masked_phone
FROM users;

2. 逗號分隔標籤查找(FIND_IN_SET)

SELECT * FROM articles 
WHERE FIND_IN_SET('mysql', tags) > 0;  -- tags 如 'mysql,sql,performance'

3. 字串分割模擬(MySQL 8.0 前無 SPLIT)

-- 取逗號分隔字串第 N 段
SET @str = 'a,b,c,d';
SELECT SUBSTRING_INDEX(SUBSTRING_INDEX(@str, ',', 3), ',', -1);  -- 'c'

效能與最佳實踐

  • 避免在 WHERE 條件對欄位使用函數:WHERE LEFT(col, 3) = 'abc' 會導致索引失效,改寫為 WHERE col LIKE 'abc%'。
  • CONCAT 參數含 NULL 導致整體為 NULL,業務拼接優先用 CONCAT_WS 或 COALESCE。
  • FIND_IN_SET 無法使用索引,大表標籤查詢建議拆關聯表或用 JSON 欄位(MySQL 5.7+)+ JSON_CONTAINS。
  • 字符集不一致隱式轉換會導致全表掃描,確保連線、表、欄位字符集一致(utf8mb4)。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved