mysql 字符串截取函数详解
在 mysql 中,字符串截取是常见的操作,主要用于从字符串中提取特定部分。mysql 提供了多种函数来实现这一功能,包括 left()
、right()
、substring()
、mid()
、substr()
和 substring_index()
等。本文将详细介绍这些函数的用法,并通过示例进行说明。
left(str, length):从左侧截取指定长度的字符
功能:从字符串 str
的左侧开始,截取 length
个字符。
语法:
left(str, length)
示例:
select left('sqlstudy.com', 3);
结果:
+-------------------------+
| left('sqlstudy.com', 3) |
+-------------------------+
| sql |
+-------------------------+
解释:从 'sqlstudy.com'
的左侧开始,截取 3 个字符,结果为 'sql'
。
right(str, length):从右侧截取指定长度的字符
功能:从字符串 str
的右侧开始,截取 length
个字符。
语法:
right(str, length)
示例:
select right('sqlstudy.com', 3);
结果:
+--------------------------+
| right('sqlstudy.com', 3) |
+--------------------------+
| com |
+--------------------------+
解释:从 'sqlstudy.com'
的右侧开始,截取 3 个字符,结果为 'com'
。
substring(str, pos) 或 substring(str, pos, len):从指定位置开始截取
功能:从字符串 str
的第 pos
个字符开始,截取 len
个字符。pos
可以是正数或负数,正数表示从左侧开始,负数表示从右侧开始。
语法:
substring(str, pos) substring(str, pos, len)
示例:
-- 从第 4 个字符开始,直到结束 select substring('sqlstudy.com', 4); -- 从第 4 个字符开始,截取 2 个字符 select substring('sqlstudy.com', 4, 2); -- 从倒数第 4 个字符开始,直到结束 select substring('sqlstudy.com', -4); -- 从倒数第 4 个字符开始,截取 2 个字符 select substring('sqlstudy.com', -4, 2);
结果:
+------------------------------+
| substring('sqlstudy.com', 4) |
+------------------------------+
| study.com |
+------------------------------++---------------------------------+
| substring('sqlstudy.com', 4, 2) |
+---------------------------------+
| st |
+---------------------------------++-------------------------------+
| substring('sqlstudy.com', -4) |
+-------------------------------+
| .com |
+-------------------------------++----------------------------------+
| substring('sqlstudy.com', -4, 2) |
+----------------------------------+
| .c |
+----------------------------------+
解释:
substring('sqlstudy.com', 4)
:从第 4 个字符开始,直到字符串结束,结果为'study.com'
。substring('sqlstudy.com', 4, 2)
:从第 4 个字符开始,截取 2 个字符,结果为'st'
。substring('sqlstudy.com', -4)
:从倒数第 4 个字符开始,直到字符串结束,结果为'.com'
。substring('sqlstudy.com', -4, 2)
:从倒数第 4 个字符开始,截取 2 个字符,结果为'.c'
。
注意:
len
必须为非负整数。若省略 len
,则默认截取到字符串末尾。
若 pos
超出字符串长度或为 0,返回空字符串。例如:
select substring('abc', 0, 1); -- 结果:空字符串 select substring('abc', 5, 1); -- 结果:空字符串
substring_index(str, delim, count):根据分隔符截取字符串
功能:根据分隔符 delim
,从字符串 str
中截取出第 count
次出现的分隔符前或后的子字符串。count
为正数时,从左侧开始计数;为负数时,从右侧开始计数。
语法:
substring_index(str, delim, count)
示例:
-- 截取第二个 '.' 之前的所有字符 select substring_index('www.sqlstudy.com.cn', '.', 2); -- 截取倒数第二个 '.' 之后的所有字符 select substring_index('www.sqlstudy.com.cn', '.', -2); -- 如果分隔符不存在,返回整个字符串 select substring_index('www.sqlstudy.com.cn', '.coc', 1);
结果:
+------------------------------------------------+
| substring_index('www.sqlstudy.com.cn', '.', 2) |
+------------------------------------------------+
| www.sqlstudy |
+------------------------------------------------++-------------------------------------------------+
| substring_index('www.sqlstudy.com.cn', '.', -2) |
+-------------------------------------------------+
| com.cn |
+-------------------------------------------------++---------------------------------------------------+
| substring_index('www.sqlstudy.com.cn', '.coc', 1) |
+---------------------------------------------------+
| www.sqlstudy.com.cn |
+---------------------------------------------------+
解释:
substring_index('www.sqlstudy.com.cn', '.', 2)
:返回第 2 次出现的.
之前的所有字符,结果为'www.sqlstudy'
。substring_index('www.sqlstudy.com.cn', '.', -2)
:返回倒数第 2 次出现的.
之后的所有字符,结果为'com.cn'
。substring_index('www.sqlstudy.com.cn', '.coc', 1)
:由于.coc
不存在于字符串中,返回整个字符串'www.sqlstudy.com.cn'
。
注意:
若 count
超过分隔符实际出现的次数,返回整个字符串。例如:
select substring_index('a.b.c.d', '.', 5); -- 结果:'a.b.c.d'
mid(str, pos, len) 或 substr(str, pos, len):与 substring
等价
功能:与 substring
函数功能相同,用于从指定位置开始截取指定长度的子字符串。
语法:
mid(str, pos, len) substr(str, pos, len)
示例:
-- 从第 4 个字符开始,截取 2 个字符 select mid('sqlstudy.com', 4, 2); -- 从倒数第 4 个字符开始,截取 2 个字符 select substr('sqlstudy.com', -4, 2);
结果:
+----------------------------------+
| mid('sqlstudy.com', 4, 2) |
+----------------------------------+
| st |
+----------------------------------++-----------------------------------+
| substr('sqlstudy.com', -4, 2) |
+-----------------------------------+
| .c |
+-----------------------------------+
解释:
mid('sqlstudy.com', 4, 2)
与substring('sqlstudy.com', 4, 2)
结果相同,均为'st'
。substr('sqlstudy.com', -4, 2)
与substring('sqlstudy.com', -4, 2)
结果相同,均为'.c'
。
多字节字符处理
mysql 的字符串截取函数默认按字符(而非字节)处理,适用于多字节字符集(如 utf-8)。例如:
select left('中文测试', 2); -- 结果:'中文' select substring('数据库', 2, 2); -- 结果:'据库'
实际应用场景
场景 1:提取邮箱的域名
select email, substring_index(email, '@', -1) as domain from users;
结果:
+-------------------+-------------+
| email | domain |
+-------------------+-------------+
| user@example.com | example.com |
+-------------------+-------------+
场景 2:解析 url 中的路径
select substring_index(substring_index(url, '//', -1), '/', 1) as host from website;
输入:'https://www.sqlstudy.com/path'
输出:'www.sqlstudy.com'
总结
函数 | 功能概要 | 核心区别 |
---|---|---|
left() / right() | 从左右侧截取固定长度 | 方向固定,长度明确 |
substring() | 灵活指定起始位置和长度 | 支持正负位置,功能最全面 |
substring_index() | 基于分隔符截取 | 适合处理结构化字符串(如路径) |
mid() / substr() | 与 substring 功能相同 | 语法别名,可互换使用 |
掌握这些函数,可以高效处理字符串截取需求,提升数据处理的灵活性。
发表评论