mysql substring(保姆级教程)

更新时间:

💡一则或许对你有用的小广告

欢迎加入小哈的星球 ,你将获得:专属的项目实战 / 1v1 提问 / Java 学习路线 / 学习打卡 / 每月赠书 / 社群讨论

  • 新项目:《从零手撸:仿小红书(微服务架构)》 正在持续爆肝中,基于 Spring Cloud Alibaba + Spring Boot 3.x + JDK 17...点击查看项目介绍 ;
  • 《从零手撸:前后端分离博客项目(全栈开发)》 2 期已完结,演示链接: http://116.62.199.48/ ;

截止目前, 星球 内专栏累计输出 82w+ 字,讲解图 3441+ 张,还在持续爆肝中.. 后续还会上新更多项目,目标是将 Java 领域典型的项目都整一波,如秒杀系统, 在线商城, IM 即时通讯,权限管理,Spring Cloud Alibaba 微服务等等,已有 2900+ 小伙伴加入学习 ,欢迎点击围观

在数据库开发中,字符串处理是一项高频操作。无论是提取用户昵称的首字母、解析日志文件,还是从URL中提取特定参数,都离不开对字符串的精准控制。MySQL SUBSTRING 函数作为字符串操作的核心工具之一,能够帮助开发者高效完成子字符串的提取、裁剪等任务。本文将从基础语法到实战案例,循序渐进地讲解这一函数的使用逻辑,并结合形象比喻和代码示例,帮助读者快速掌握其核心技巧。


SUBSTRING 函数基础语法:定位字符串的“剪刀”

想象你有一本厚重的书籍,想要快速找到某一段文字。SUBSTRING 就像一把精准的剪刀,能够根据位置和长度参数,从字符串中“剪裁”出所需的片段。其核心语法分为两种形式:

SUBSTRING(str FROM pos)  
SUBSTRING(str, pos, len)  

参数解析

  • str:目标字符串,可以是列名、变量或直接输入的字符串。
  • pos:起始位置,从1开始计数。若为负数,则表示从字符串末尾倒数。
  • len(可选):截取的长度。若省略,则截取从起始位置到字符串末尾的所有字符。

示例对比
| 语法形式 | 作用说明 |
|----------------|------------------------------------|
| SUBSTRING(str FROM pos) | 从指定位置开始截取到字符串末尾 |
| SUBSTRING(str, pos, len) | 从指定位置开始截取指定长度的字符 |

案例演示

SELECT SUBSTRING('Hello World', 2); -- 输出 "ello World"  
SELECT SUBSTRING('Hello World', 2, 4); -- 输出 "ello"  
SELECT SUBSTRING('Hello World', -6); -- 输出 "World"(从末尾第6位开始截取)  

位置参数的灵活运用:负数与越界处理

正数位置:从左到右定位

pos 为正数,则从字符串左侧开始计数。例如:

SELECT SUBSTRING('MySQL', 2, 3); -- 输出 "ySQ"(位置2是 'y',截取3个字符)  

负数位置:从右到左倒推

pos 为负数时,表示从字符串末尾开始倒数。例如:

SELECT SUBSTRING('2023-10-05', -5); -- 输出 "10-05"(从末尾第5位开始截取)  

越界处理:自动调整到安全范围

若起始位置超过字符串长度,MySQL 会返回空字符串。例如:

SELECT SUBSTRING('ABC', 5); -- 输出空字符串 ""  

SUBSTRING_INDEX:按分隔符分割字符串

SUBSTRING_INDEXSUBSTRING 的扩展函数,专门用于按分隔符截取字符串片段。其语法为:

SUBSTRING_INDEX(str, delimiter, count)  
  • delimiter:分隔符,可以是单个字符或字符串。
  • count:控制截取方向。若为正数,截取分隔符左侧的部分;若为负数,截取右侧的部分。

比喻说明
想象将字符串比作一串珠子,分隔符是珠子间的线。count=2 表示取前两段珠子,count=-2 则取最后两段。

案例演示

SELECT SUBSTRING_INDEX('a.b.c.d', '.', 2); -- 输出 "a.b"(取前两段)  
SELECT SUBSTRING_INDEX('a.b.c.d', '.', -2); -- 输出 "c.d"(取后两段)  

实战案例:SUBSTRING 在真实场景中的应用

案例1:提取邮箱域名

假设用户表中存储了邮箱地址,需提取域名部分:

SELECT SUBSTRING_INDEX(email, '@', -1) AS domain  
FROM users;  

案例2:处理日期时间字符串

从日期字符串中提取年份和月份:

SELECT  
  SUBSTRING(date_str, 1, 4) AS year,  
  SUBSTRING(date_str, 6, 2) AS month  
FROM orders;  

案例3:从URL中提取参数值

假设URL为 https://example.com?user=123&role=admin,需提取 user 参数的值:

SELECT  
  SUBSTRING_INDEX(SUBSTRING_INDEX(url, 'user=', 2), '=', -1) AS user_id  
FROM log_table;  

此处通过两次嵌套使用 SUBSTRING_INDEX,先定位到 user= 后的部分,再取等号后的值。


与其它函数结合:提升字符串处理能力

结合 LENGTH() 计算字符串长度

SELECT SUBSTRING(comment, 1, LENGTH(comment)/2) AS first_half  
FROM feedback;  

此语句可截取评论内容的前半部分。

结合 CONCAT() 合并字符串

SELECT CONCAT('ID:', SUBSTRING(name, 1, 3)) AS short_id  
FROM employees;  

常见误区与解决方案

误区1:忽略负数位置的计算逻辑

错误代码:

SELECT SUBSTRING('MySQL', -2); -- 输出 "yl"(截取最后两位)  

需注意负数从末尾倒数,而非从0开始计数。

误区2:SUBSTRING 与 SUBSTRING_INDEX 的混淆

SUBSTRING 按位置截取,而 SUBSTRING_INDEX 按分隔符截取。例如,若需截取 a,b,c 的前两段,应使用:

SELECT SUBSTRING_INDEX('a,b,c', ',', 2); -- 输出 "a,b"  

性能优化与进阶技巧

避免全表扫描

若需频繁截取字符串,建议将结果存储为独立列,并建立索引。例如:

ALTER TABLE users ADD COLUMN username_prefix VARCHAR(3);  
UPDATE users SET username_prefix = SUBSTRING(name, 1, 3);  

使用正则表达式替代复杂截取

对于更复杂的模式匹配,可考虑 REGEXP_SUBSTR()(MySQL 8.0+):

SELECT REGEXP_SUBSTR(url, 'user=(\\d+)') AS user_id  
FROM log_table;  

**结论

MySQL SUBSTRING 函数如同一把多功能的“字符串剪刀”,通过精准的位置和分隔符控制,能够应对开发中的多样化场景。从基础语法到与其它函数的结合,掌握其核心逻辑后,开发者可以高效完成数据清洗、格式化输出等任务。建议读者通过实际项目反复练习,并尝试将 SUBSTRING 与其他字符串函数(如 REPLACELOCATE)组合使用,进一步提升开发效率。

提示:若需深入学习,可探索 SUBSTR(与 SUBSTRING 等效)、MID 等函数的异同,或研究正则表达式在字符串处理中的高级应用。

最新发布