[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() 是功能最全面的首选,而其他函数在特定场景下能让代码更简洁易读。

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

相关推荐
小马同学-1 小时前
MySQL主从复制和读写分离
数据库·mysql
海绵宝宝转agent2 小时前
MySql高频面试八股开源笔记总结
mysql·面试·开源
余槐i3 小时前
数据没回滚也不报错:@Transactional 自调用失效的 3 种复现与修复
spring boot·mysql·多线程·spring 事务
写后端的胖头鱼8 小时前
【高频面试题】FullText 全文索引(MySQL)
数据库·mysql·索引·全文索引
code_whiter9 小时前
01-MySQL数据库基础
数据库·mysql
vx_Biye_Design12 小时前
springboot宠物领养与救助平台64334-计算机课程设计、毕业设计
java·vue.js·spring boot·后端·mysql·课程设计·宠物
做运维的阿瑞12 小时前
mysql数据库视图笔记:创建、修改、删除与适用场景
数据库·笔记·mysql
java1234_小锋13 小时前
【技术专题】Mysql8 数据库 - Mysql8 数据库基本操作
数据库·mysql
专业程序开发源14 小时前
springboot生命故事书制作小程序65290-计算机课程设计、毕业设计
java·vue.js·spring boot·后端·mysql·小程序·课程设计
jason.zeng@150220714 小时前
canal做mysql的异步传输工具
数据库·mysql·linq