萬盛學電腦網

您现在的位置: 萬盛學電腦網 >> 程式設計 >  >> 資料庫 >> MySQL 教學

MySQL 字符串函數大全:長度、填充、裁剪、截取、拼接、查找、替換、大小寫、編碼轉換實戰

長度與字節

SELECT LENGTH('abcdefg'), LENGTH('中文');        -- 7, 6 (utf8mb4 中文 3 字節)
SELECT CHAR_LENGTH('abcdefg'), CHAR_LENGTH('中文'); -- 7, 2 (字符數)
SELECT BIT_LENGTH('abc');                      -- 21 (位數)

填充與裁剪

函數 語法 示例 結果
LPAD LPAD(str, len, padstr) LPAD('42', 5, '0') '00042'
RPAD RPAD(str, len, padstr) RPAD('42', 5, '0') '42000'
LTRIM LTRIM(str) LTRIM(' abc') 'abc'
RTRIM RTRIM(str) RTRIM('abc ') 'abc'
TRIM TRIM([[BOTH|LEADING|TRAILING] remstr FROM] str) TRIM(' abc ')
TRIM(LEADING '!' FROM '!!!abc!!!')
'abc'
'abc!!!'

截取與子串

函數 語法 說明 示例
LEFT LEFT(str, len) 左側起 len 字符 LEFT('abcdef', 3) → 'abc'
RIGHT RIGHT(str, len) 右側起 len 字符 RIGHT('abcdef', 3) → 'def'
SUBSTRING
SUBSTR
SUBSTRING(str, pos, len)
SUBSTRING(str FROM pos FOR len)
位置從 1 起算,可負數(倒數) SUBSTRING('abcdef', 2, 3) → 'bcd'
SUBSTRING('abcdef', -3, 2) → 'de'
MID MID(str, pos, len) SUBSTRING 同義詞 同上

拼接與分隔

SELECT CONCAT('a','b','c');           -- 'abc',任一參數 NULL → 結果 NULL
SELECT CONCAT_WS(',', 'a', 'b', 'c'); -- 'a,b,c',忽略 NULL 參數

查找與定位

函數 語法 返回值 示例
LOCATE LOCATE(substr, str, [pos]) 首次出現位置(1-based),未找到 0 LOCATE('b', 'abcabc') → 2
POSITION POSITION(substr IN str) 同 LOCATE,標準 SQL POSITION('b' IN 'abc') → 2
INSTR INSTR(str, substr) 同 LOCATE,參數順序相反 INSTR('abcabc', 'b') → 2
FIND_IN_SET FIND_IN_SET(str, strlist) 在逗號分隔列表中位置(1-based) FIND_IN_SET('b', 'a,b,c') → 2
STRCMP STRCMP(str1, str2) 0 相等,1 str1>str2,-1 str1 STRCMP('a','b') → -1

替換與插入

-- REPLACE:全量替換
SELECT REPLACE('I love MySQL', 'MySQL', 'MariaDB');  -- 'I love MariaDB'

-- INSERT:指定位置長度替換(非 DML INSERT)
SELECT INSERT('abcdef', 2, 3, 'XYZ');  -- 'aXYZef' (位置2起3字符替換為XYZ)

重複與反轉

SELECT REPEAT('ab', 3);        -- 'ababab'
SELECT REVERSE('abcdef');      -- 'fedcba'

大小寫轉換

SELECT UPPER('abc'), LOWER('ABC');
SELECT UCASE('abc'), LCASE('ABC');  -- 同義詞

編碼與進制轉換

函數 用途 示例
ASCII 首字符 ASCII 碼 ASCII('A') → 65
ORD 首字符編碼(多字節支援) ORD('中') → 20013 (UTF-8 編碼點)
CHAR 碼點轉字符 CHAR(65, 66) → 'AB'
CONV 進制轉換 CONV(15, 10, 16) → 'F'
BIN 十進制轉二進制字符串 BIN(12) → '1100'
OCT 十進制轉八進制 OCT(12) → '14'
HEX 十進制/字符串轉十六進制 HEX(255) → 'FF'
HEX('abc') → '616263'
UNHEX 十六進制轉二進制字符串 UNHEX('616263') → 'abc'

進階實用組合

提取逗號分隔列表第 N 項

-- 利用 SUBSTRING_INDEX
SET @csv = 'a,b,c,d,e';
SELECT SUBSTRING_INDEX(SUBSTRING_INDEX(@csv, ',', 3), ',', -1);  -- 第 3 項 'c'

-- 通用函數(MySQL 8.0+ 可用 JSON_TABLE 更優雅)

去除多餘空格(正規化)

SELECT TRIM(REPLACE(REPLACE(col, CHAR(13), ''), CHAR(10), '')) FROM t;  -- 除換行
SELECT REGEXP_REPLACE(col, '\\s+', ' ') FROM t;  -- 8.0+ 正則替換多空格為單空格

掩碼/脫敏

-- 手機號中間 4 位掩碼
SELECT CONCAT(LEFT(phone, 3), '****', RIGHT(phone, 4)) FROM users;

-- 身份證前 6 後 4 顯示
SELECT CONCAT(LEFT(id_card, 6), REPEAT('*', 8), RIGHT(id_card, 4)) FROM users;

效能提示

  • LENGTH/CHAR_LENGTH 在 WHERE 條件中會導致全表掃描,**避免** WHERE LENGTH(name) > 10,改用應用層校驗或函數索引(8.0+ CREATE INDEX idx_name_len ON t ((CHAR_LENGTH(name))))。
  • CONCAT 大量拼接產生臨時對象,批量導出考慮 GROUP_CONCAT 或應用層組裝。
  • FIND_IN_SET、REGEXP 無法使用索引,大表慎用。

版本差異提示

  • MySQL 8.0 新增 REGEXP_REPLACE、REGEXP_SUBSTR、REGEXP_INSTR(ICU 正則)。
  • utf8mb4 下 CHAR_LENGTH = 字符數,LENGTH = 字節數(中文 3-4 字節)。
  • STRCMP 不區分大小寫(依校對規則),需區分大小寫用 STRCMP(BINARY str1, BINARY str2) 或 str1 COLLATE utf8mb4_bin = str2。
copyright © 萬盛學電腦網 all rights reserved