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

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

相关推荐
怣509 小时前
MySQL子查询实战指南:数据操作(增删改查)与通用表达式
数据库·chrome·mysql
咩咩不吃草10 小时前
【MySQL】表和列、增删改查语句及数据类型约束详解
数据库·mysql·语法
存在的五月雨11 小时前
Spring Security认证流程
java·开发语言·mysql
禹凕11 小时前
Python编程——进阶知识(MYSQL引导入门)
开发语言·python·mysql
ccecw20 小时前
Mysql ONLY_FULL_GROUP_BY模式详解、group by非查询字段报错
数据库·mysql
JH307320 小时前
达梦数据库与MySQL的核心差异解析:从特性到实践
数据库·mysql
Goat恶霸詹姆斯1 天前
mysql常用语句
数据库·mysql·oracle
洛豳枭薰1 天前
Innodb一次更新动作
mysql
xcLeigh1 天前
Python 项目实战:用 Flask 实现 MySQL 数据库增删改查 API
数据库·python·mysql·flask·教程·python3
Fleshy数模1 天前
MySQL 表创建全攻略:Navicat 图形化与 Xshell 命令行双模式实践
linux·mysql