MySQL 提供豐富字串函數。本文彙整 51 個函數分類速查:ASCII/位元/長度、連接/插入/替換、大小寫/修剪/反轉、比較/搜尋/子字串、編碼/壓縮/十六進位、模式匹配、字串連接差異。
快速分類索引
| 類別 | 代表函數 |
| 資訊取得 | ASCII, BIT_LENGTH, CHAR_LENGTH, LENGTH, OCTET_LENGTH |
| 連接合併 | CONCAT, CONCAT_WS |
| 插入替換 | INSERT, REPLACE, REPLACE |
| 大小寫轉換 | LOWER/LCASE, UPPER/UCASE |
| 修剪空白 | LTRIM, RTRIM, TRIM |
| 子字串擷取 | LEFT, RIGHT, MID, SUBSTRING, SUBSTRING_INDEX |
| 搜尋定位 | LOCATE, POSITION, INSTR, FIND_IN_SET |
| 比較 | STRCMP |
| 反轉/重複 | REVERSE, REPEAT, SPACE |
| 填充 | LPAD, RPAD |
| 編碼轉換 | HEX, UNHEX, CONV, BIN, OCT |
| 壓縮 | COMPRESS, UNCOMPRESS, UNCOMPRESSED_LENGTH |
| Soundex | SOUNDEX |
| 模式匹配 | LIKE (% _), REGEXP |
高頻函數詳細說明與範例
連接字串
CONCAT('My', '_', '2001') -- 'My_2001'
CONCAT_WS(',', 'a', 'b', 'c') -- 'a,b,c' (第一參數為分隔符)
-- ⚠️ SQL Server 用 +,MySQL 用 CONCAT
子字串擷取
LEFT('abcdef', 3) -- 'abc'
RIGHT('abcdef', 3) -- 'def'
SUBSTRING('abcdef', 2, 3) -- 'bcd' (位置從 1 開始)
SUBSTRING_INDEX('a,b,c', ',', 2) -- 'a,b' (第 2 個分隔符前)
SUBSTRING_INDEX('a,b,c', ',', -1) -- 'c' (最後一段)
搜尋定位
LOCATE('b', 'abc') -- 2
INSTR('abc', 'b') -- 2 (參數順序相反)
FIND_IN_SET('b', 'a,b,c') -- 2
大小寫/修剪
LOWER('ABC') -- 'abc'
UPPER('abc') -- 'ABC'
TRIM(' abc ') -- 'abc'
LTRIM(' abc') -- 'abc'
RTRIM('abc ') -- 'abc'
替換/插入
REPLACE('abcabc', 'bc', 'XY') -- 'aXYaXY'
INSERT('abcdef', 2, 3, 'XYZ') -- 'aXYZef' (位置2,長度3替換)
填充
LPAD('5', 3, '0') -- '005'
RPAD('5', 3, '0') -- '500'
編碼/壓縮
HEX('abc') -- '616263'
UNHEX('616263') -- 'abc'
COMPRESS('long text') -- 二進位壓縮資料
UNCOMPRESS(comp) -- 解壓縮
模式匹配
col LIKE 'a%' -- 以 a 開頭
col LIKE '%a%' -- 含 a
col LIKE '_a' -- 第二字元為 a
col REGEXP '^[0-9]+$' -- 純數字
字串連接跨資料庫差異
| 資料庫 | 連接運算子/函數 |
| MySQL | CONCAT() |
| SQL Server | + |
| Oracle | || |
| PostgreSQL | || |
實務提醒
- ✅ 字串函數引數為二進位字串時,回傳也為二進位(影響比較)
- ✅ 數字隱含轉字串:
SELECT CONCAT(2, ' test') → '2 test'
- ✅ 明確轉字串:
CAST(num AS CHAR) 或 CONCAT(num, '')
- ⚠️
TRIM 預設只去空白,需指定字元:TRIM(BOTH 'x' FROM 'xxabcxx')