MySQL 中 字符串函数 的详细讲解,涵盖常用函数分类、语法、示例及注意事项:
一、字符串基础操作函数
1. CONCAT(str1, str2, ...)
功能:连接多个字符串
示例:
SELECT CONCAT('Hello', ' ', 'World'); -- 输出:'Hello World'
SELECT CONCAT(first_name, ' ', last_name) AS full_name FROM users;
2. CONCAT_WS(separator, str1, str2, ...)
功能:用指定分隔符连接字符串
示例:
SELECT CONCAT_WS(', ', 'Apple', 'Banana', 'Orange'); -- 输出:'Apple, Banana, Orange'
3. LENGTH(str)
/ CHAR_LENGTH(str)
区别:
LENGTH()
:返回字节数(受字符集影响)CHAR_LENGTH()
:返回字符数
示例:
SELECT LENGTH('中国'); -- UTF8 中文字符占3字节 → 6
SELECT CHAR_LENGTH('中国'); -- 字符数 → 2
二、字符串截取与拆分
1. SUBSTRING(str, start, length)
功能:从位置 start
截取 length
个字符(下标从 1 开始)
别名:SUBSTR()
, MID()
示例:
SELECT SUBSTRING('MySQL Tutorial', 7, 5); -- 输出:'Tutor'
2. LEFT(str, len)
/ RIGHT(str, len)
功能:截取左/右侧指定长度的字符
示例:
SELECT LEFT('Database', 4); -- 输出:'Data'
SELECT RIGHT('Database', 4); -- 输出:'base'
3. SUBSTRING_INDEX(str, delimiter, count)
功能:按分隔符截取部分字符串
count > 0
:从左开始取count < 0
:从右开始取
示例:
SELECT SUBSTRING_INDEX('www.mysql.com', '.', 2); -- 输出:'www.mysql'
SELECT SUBSTRING_INDEX('www.mysql.com', '.', -1); -- 输出:'com'
三、字符串搜索与定位
1. LOCATE(substr, str, [start])
功能:返回子串首次出现的位置(找不到返回0)
别名:POSITION(substr IN str)
示例:
SELECT LOCATE('SQL', 'MySQL SQL'); -- 输出:3 (从第1个字符开始找)
SELECT LOCATE('SQL', 'MySQL SQL', 5); -- 从第5位开始找 → 7
2. INSTR(str, substr)
功能:同 LOCATE
,但参数顺序相反
示例:
SELECT INSTR('MySQL', 'SQL'); -- 输出:3
四、字符串替换与修改
1. REPLACE(str, from_str, to_str)
功能:替换所有匹配的子串
示例:
SELECT REPLACE('I like cats', 'cats', 'dogs'); -- 输出:'I like dogs'
2. INSERT(str, pos, len, newstr)
功能:从位置 pos
开始替换 len
个字符为 newstr
示例:
SELECT INSERT('Hello World', 7, 5, 'MySQL'); -- 输出:'Hello MySQL'
3. TRIM([{BOTH|LEADING|TRAILING} [remstr] FROM] str)
功能:去除首尾指定字符(默认去空格)
示例:
SELECT TRIM(' MySQL '); -- 输出:'MySQL'
SELECT TRIM(LEADING 'x' FROM 'xxxSQLxxx'); -- 输出:'SQLxxx'
五、大小写转换
1. UPPER(str)
/ UCASE(str)
功能:转大写
示例:
SELECT UPPER('Hello'); -- 输出:'HELLO'
2. LOWER(str)
/ LCASE(str)
功能:转小写
示例:
SELECT LOWER('SQL'); -- 输出:'sql'
六、字符串填充
1. LPAD(str, len, padstr)
功能:左侧填充至长度 len
示例:
SELECT LPAD('7', 3, '0'); -- 输出:'007'
2. RPAD(str, len, padstr)
功能:右侧填充至长度 len
示例:
SELECT RPAD('Hi', 5, '!'); -- 输出:'Hi!!!'
七、字符串比较与格式化
1. STRCMP(expr1, expr2)
功能:比较字符串
- 返回
0
:相等 - 返回
1
:expr1 > expr2
- 返回
-1
:expr1 < expr2
示例:
SELECT STRCMP('apple', 'banana'); -- 输出:-1
2. FORMAT(X, D)
功能:数字格式化(千位分隔,四舍五入)
示例:
SELECT FORMAT(1234567.4567, 2); -- 输出:'1,234,567.46'
八、其他实用函数
1. REPEAT(str, count)
功能:重复字符串
SELECT REPEAT('Ha', 3); -- 输出:'HaHaHa'
2. REVERSE(str)
功能:反转字符串
SELECT REVERSE('SQL'); -- 输出:'LQS'
3. SPACE(N)
功能:生成 N
个空格
SELECT CONCAT('Hello', SPACE(3), 'World'); -- 输出:'Hello World'
九、实战应用场景
场景1:格式化电话号码
SELECT
phone,
CONCAT(
SUBSTRING(phone, 1, 3),
'-',
SUBSTRING(phone, 4, 4),
'-',
SUBSTRING(phone, 8, 4)
) AS formatted_phone
FROM contacts;
场景2:提取邮箱域名
SELECT
email,
SUBSTRING_INDEX(email, '@', -1) AS domain
FROM users;
场景3:安全显示敏感信息
SELECT
CONCAT(
LEFT(card_number, 4),
REPEAT('*', LENGTH(card_number) - 8),
RIGHT(card_number, 4)
) AS masked_card
FROM payments;
十、注意事项
- 字符集影响:
- 函数如
LENGTH()
在utf8mb4
中可能返回意外字节数(如表情符号占4字节)
- 函数如
- NULL 处理:
- 输入参数为
NULL
时,大多数函数返回NULL
SELECT CONCAT('Hello', NULL); -- 输出:NULL
- 输入参数为
- 性能优化:
- 避免在
WHERE
条件中对列使用函数(如WHERE UPPER(name) = 'JOHN'
),会导致索引失效
- 避免在
- 多字节字符:
- 使用
CHAR_LENGTH()
替代LENGTH()
处理多语言文本
- 使用
总结对比表
函数类别 | 常用函数 | 核心用途 |
---|---|---|
连接 | CONCAT , CONCAT_WS |
字符串拼接 |
长度计算 | LENGTH , CHAR_LENGTH |
字节/字符数统计 |
截取 | SUBSTRING , LEFT , RIGHT |
提取子串 |
定位 | LOCATE , INSTR |
查找子串位置 |
替换 | REPLACE , INSERT |
修改字符串内容 |
空白处理 | TRIM , LTRIM , RTRIM |
去除首尾字符 |
大小写 | UPPER , LOWER |
转换大小写 |
填充 | LPAD , RPAD |
按长度填充字符串 |
实用工具 | REPEAT , REVERSE , SPACE |
生成特定格式字符串 |