字符串處理是 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 個空格,常用於格式化輸出。
| 函數 | 語法 | 說明 | 關鍵點 |
|---|---|---|---|
LEFT | LEFT(str, len) | 左側起取 len 字元 | len 超過長度返回全串 |
RIGHT | RIGHT(str, len) | 右側起取 len 字元 | 同上 |
SUBSTRING | SUBSTRING(str, pos, len) | 從 pos 起取 len 字元 | pos 從 1 開始,非 0 |
LOCATE | LOCATE(substr, str, [start]) | 查找子串首次出現位置 | 不存在返回 0;區分大小寫取決於校對規則 |
FIND_IN_SET | FIND_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'
SELECT CONCAT(LEFT(phone, 3), '****', RIGHT(phone, 4)) AS masked_phone
FROM users;
SELECT * FROM articles
WHERE FIND_IN_SET('mysql', tags) > 0; -- tags 如 'mysql,sql,performance'
-- 取逗號分隔字串第 N 段
SET @str = 'a,b,c,d';
SELECT SUBSTRING_INDEX(SUBSTRING_INDEX(@str, ',', 3), ',', -1); -- 'c'
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)。