[mysql]字符串截取

在MySQL中,最核心和常用的字符串截取函数是 SUBSTRING()(或其别名 SUBSTR()MID()),但根据不同的截取需求,还有其他几个实用的函数。

下表对比了这些常用函数,方便你快速了解:

函数 语法 功能描述
SUBSTRING() SUBSTRING(str, pos, len) 从字符串str的指定位置pos开始,截取长度为len的子串。最灵活。在mysql中, pos从1开始
LEFT() LEFT(str, len) 从字符串str左侧 开始,截取指定长度len的子串。
RIGHT() RIGHT(str, len) 从字符串str右侧 开始,截取指定长度len的子串。
SUBSTRING_INDEX() SUBSTRING_INDEX(str, delim, count) 按分隔符delim截取。count为正时取左部分,为负时取右部分。

🧩 核心函数:SUBSTRING() 详解

SUBSTRING() 是最通用的截取函数,其完整语法如下:

sql 复制代码
SUBSTRING(str, pos, len)
  • str:要处理的原始字符串。
  • pos :起始位置。
    • 值为正数 时,从字符串开头 的第pos个字符开始(MySQL中位置从1开始计数)。
    • 值为负数 时,从字符串末尾 倒数的第pos个字符开始。
  • len (可选):要截取的长度。如果省略,则截取从pos开始到字符串末尾的所有字符。

📝 不同函数的典型用法示例

了解语法后,通过具体例子能更清楚地知道如何选择:

  • 使用 SUBSTRING()

    sql 复制代码
    -- 从第4个字符开始截取到最后
    SELECT SUBSTRING('Hello, World!', 8); -- 结果: 'World!'
    -- 从第1个字符开始,截取5个字符
    SELECT SUBSTRING('Hello, World!', 1, 5); -- 结果: 'Hello'
    -- 从倒数第6个字符开始,截取5个字符
    SELECT SUBSTRING('Hello, World!', -6, 5); -- 结果: 'World'
  • 使用 LEFT()RIGHT()(适合从固定一侧截取)

    sql 复制代码
    SELECT LEFT('MySQL', 2); -- 结果: 'My' (从左截取)
    SELECT RIGHT('MySQL', 3); -- 结果: 'SQL' (从右截取)
  • 使用 SUBSTRING_INDEX()(适合按分隔符截取)

    sql 复制代码
    -- 获取邮箱域名部分:找到第二个'.'之前的所有内容
    SELECT SUBSTRING_INDEX('www.example.com', '.', 2); -- 结果: 'www.example'
    -- 获取最后两部分:从右侧开始,找到第二个'.'之后的所有内容
    SELECT SUBSTRING_INDEX('www.example.com', '.', -2); -- 结果: 'example.com'

💡 使用技巧与注意事项

在实际使用时,有几个关键点需要注意:

  • 组合使用 :可以将截取函数与其他字符串函数(如 LOCATE()LENGTH())组合,应对复杂场景。例如,截取邮箱的用户名部分:

    sql 复制代码
    SELECT SUBSTRING('user@example.com', 1, LOCATE('@', 'user@example.com')-1);
    -- LOCATE('@', ...) 返回'@'的位置,减1后作为长度参数
    -- 结果: 'user'
  • 参数边界

    • 如果起始位置 pos 超出字符串长度,函数将返回空字符串 ''
    • 截取长度 len 不能为负数,否则也会返回空字符串。

🔍 如何选择函数

面对不同需求,你可以这样快速选择:

  • 从指定位置截取指定长度 :用 SUBSTRING()
  • 总是从字符串的左侧或右侧开始截取 :用 LEFT()RIGHT(),语法更简洁。
  • 按分隔符(如-/.)截取某部分 :用 SUBSTRING_INDEX()

总的来说,SUBSTRING() 是功能最全面的首选,而其他函数在特定场景下能让代码更简洁易读。

如果你能告诉我你具体想处理什么样的字符串数据(比如是邮箱、网址,还是有固定格式的编码),我可以给你更具体的截取方案。

相关推荐
sxlishaobin12 小时前
MySQL- explain
数据库·mysql
源代码•宸13 小时前
Leetcode—620. 有趣的电影&&Q3. 有趣的电影【简单】
数据库·后端·mysql·算法·leetcode·职场和发展
快乐肚皮13 小时前
MySQL递归CTE
java·数据库·mysql·递归表达式
中國移动丶移不动14 小时前
Python MySQL 数据库操作完整示例
数据库·python·mysql
zhcf18 小时前
【MySQL】聚簇索引与非聚簇索引
数据库·mysql
姓蔡小朋友19 小时前
MySQL事务、InnoDB存储引擎
java·数据库·mysql
拾荒的小海螺19 小时前
MySQL:死锁问题分析与解决方案
数据库·mysql
镜花水月linyi21 小时前
MySQL与Redis缓存一致性方案
redis·后端·mysql
xu_ws1 天前
Linux CentOS 7.9 MySQL 8.0安装配置全攻略
linux·运维·mysql·centos
czlczl200209251 天前
双 Token 机制下的无感刷新(Refresh Token)后端实现
数据库·spring boot·redis·后端·mysql