mysql 字符串截取(长文讲解)
💡一则或许对你有用的小广告
欢迎加入小哈的星球 ,你将获得:专属的项目实战 / 1v1 提问 / Java 学习路线 / 学习打卡 / 每月赠书 / 社群讨论
- 新项目:《从零手撸:仿小红书(微服务架构)》 正在持续爆肝中,基于
Spring Cloud Alibaba + Spring Boot 3.x + JDK 17...
,点击查看项目介绍 ;演示链接: http://116.62.199.48:7070 ;- 《从零手撸:前后端分离博客项目(全栈开发)》 2 期已完结,演示链接: http://116.62.199.48/ ;
截止目前, 星球 内专栏累计输出 90w+ 字,讲解图 3441+ 张,还在持续爆肝中.. 后续还会上新更多项目,目标是将 Java 领域典型的项目都整一波,如秒杀系统, 在线商城, IM 即时通讯,权限管理,Spring Cloud Alibaba 微服务等等,已有 3100+ 小伙伴加入学习 ,欢迎点击围观
在数据库开发与数据处理中,字符串操作是一项高频需求。无论是解析订单编号、提取用户昵称,还是处理 URL 参数,MySQL 字符串截取技术都是开发者必须掌握的核心技能之一。本文将从基础语法到高级技巧,结合实际案例,逐步解析 MySQL 中字符串截取的实现方法,帮助读者在不同场景下灵活运用这些工具。
一、MySQL 字符串截取的基础函数
MySQL 提供了多个内置函数来实现字符串的截取功能。以下是最常用的三个函数:
1. SUBSTRING
函数
SUBSTRING
是最基础的字符串截取函数,其语法格式如下:
SUBSTRING(str, pos, len)
str
:需要截取的原始字符串。pos
:起始位置(注意:MySQL 中字符串的索引从1
开始)。len
:截取的长度(可选参数,若省略则截取到字符串末尾)。
示例 1:从第 3 个字符开始截取 5 个字符
SELECT SUBSTRING('Hello World', 3, 5);
-- 输出结果:'llo W'
示例 2:截取从第 5 个字符到末尾
SELECT SUBSTRING('Hello World', 5);
-- 输出结果:'o World'
比喻说明:
可以将字符串想象成一排书架上的书,SUBSTRING
就像是从指定位置(pos
)开始,取一定数量(len
)的书,最终形成一个新书架。
2. LEFT
和 RIGHT
函数
这两个函数专门用于从字符串的左侧或右侧截取指定长度的子串:
LEFT(str, len)
:从字符串左侧开始截取len
个字符。RIGHT(str, len)
:从字符串右侧开始截取len
个字符。
示例 3:截取前 5 个字符
SELECT LEFT('Hello World', 5);
-- 输出结果:'Hello'
示例 4:截取最后 5 个字符
SELECT RIGHT('Hello World', 5);
-- 输出结果:'World'
对比总结:
| 函数 | 适用场景 | 索引方向 |
|--------------|------------------------------|---------------|
| SUBSTRING
| 需要精确控制起始位置和长度 | 从左到右 |
| LEFT
| 只需截取左侧固定长度 | 固定从左侧开始|
| RIGHT
| 只需截取右侧固定长度 | 固定从右侧开始|
二、进阶技巧:结合其他函数实现复杂截取
单纯的截取函数可能无法满足复杂需求,此时需要结合其他函数(如 LENGTH
、LOCATE
、INSTR
等)来实现更灵活的逻辑。
1. 截取特定分隔符前的内容
假设订单编号为 ORD_202310_A
,需要提取年份 2023
:
SELECT SUBSTRING('ORD_202310_A', 5, 4);
-- 输出结果:'2023'
但若年份位置不固定,可结合 LOCATE
定位下划线的位置:
SELECT SUBSTRING(
'ORD_202310_A',
LOCATE('_', 'ORD_202310_A') + 1,
4
);
-- 输出结果:'2023'
2. 处理多字节字符问题
对于中文或特殊符号,需注意字符与字节的区别。例如:
SELECT LENGTH('你好'), CHAR_LENGTH('你好');
-- 输出:6(字节长度) | 2(字符长度)
在截取多字节字符时,建议使用 CHAR_LENGTH
或 CHAR_SUBSTR
(MySQL 8.0+):
SELECT SUBSTRING('你好世界', 2, 2);
-- 输出结果:'好世'(正确)
3. 使用 SUBSTRING_INDEX
处理分隔符
当需要按分隔符截取时,SUBSTRING_INDEX
更高效:
SELECT SUBSTRING_INDEX('a,b,c,d', ',', 2); -- 输出 'a,b'
SELECT SUBSTRING_INDEX('a,b,c,d', ',', -2); -- 输出 'c,d'
三、实战案例与常见场景
案例 1:从 URL 中提取参数
假设有一个 URL 字段 http://example.com/product?category=electronics&id=123
,需要提取 id
的值:
SELECT SUBSTRING_INDEX(
SUBSTRING_INDEX('http://example.com/product?category=electronics&id=123', 'id=', -1),
'&', 1
);
-- 输出结果:'123'
案例 2:处理多字节昵称
用户昵称 张三_2023
需截取中文部分:
SELECT LEFT('张三_2023', 2); -- 输出 '张三'
案例 3:优化查询性能
若需频繁按截取后的字段查询(如按年份筛选订单),建议通过索引优化:
-- 创建虚拟列存储年份
ALTER TABLE orders ADD COLUMN year_part VARCHAR(4) AS (SUBSTRING(order_id, 5, 4));
-- 然后为虚拟列创建索引
CREATE INDEX idx_year_part ON orders (year_part);
四、注意事项与优化建议
1. 索引与性能
字符串函数直接作用于字段时,可能导致索引失效。例如:
-- 不建议直接写成这样
SELECT * FROM users WHERE SUBSTRING(nickname, 1, 2) = '张';
应改为:
-- 通过虚拟列或索引覆盖
SELECT * FROM users WHERE nickname BETWEEN '张A' AND '张z';
2. 多字节字符兼容性
确保数据库和表的字符集设置为 utf8mb4
,以支持中文、表情符号等多字节字符。
3. 函数嵌套的可读性
复杂逻辑建议分步实现:
-- 不建议
SELECT SUBSTRING(LEFT(name, 5), 3);
-- 可改为
SELECT SUBSTRING(sub_name, 3)
FROM (
SELECT LEFT(name, 5) AS sub_name
FROM users
) AS temp;
结论
MySQL 字符串截取技术是开发者处理数据时的重要工具。通过掌握 SUBSTRING
、LEFT
、RIGHT
等基础函数,并结合 LOCATE
、SUBSTRING_INDEX
等进阶方法,开发者可以灵活应对订单解析、URL 处理、多语言支持等场景。在实际应用中,需注意索引优化、多字节兼容性等问题,以确保代码的高效性和可维护性。希望本文能帮助读者在 MySQL 字符串截取领域建立起系统的认知,并在项目中游刃有余地应用这些技术。