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

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

相关推荐
小冷coding1 天前
【MySQL】MySQL 插入一条数据的完整流程(InnoDB 引擎)
数据库·mysql
周杰伦的稻香1 天前
MySQL中常见的慢查询与优化
android·数据库·mysql
·云扬·1 天前
MySQL 常见存储引擎详解及面试高频考点
数据库·mysql·面试
何以不说话1 天前
mysql 的主从复制
运维·数据库·学习·mysql
橘子131 天前
MySQL库的操作(二)
数据库·mysql·oracle
·云扬·1 天前
MySQL各版本核心特性演进与主流分支深度解析
数据库·sql·mysql
田超凡1 天前
深入理解MySQL_6 Temporary临时表
mysql·java-ee
尽兴-1 天前
MySQL 8.0主从复制原理与实战深度解析
数据库·mysql·主从复制
YongCheng_Liang2 天前
MySQL 高级特性深度解析:从索引优化到高可用架构
运维·数据库·mysql
<花开花落>2 天前
MySQL 数据备份流程化
mysql·systemd