mysql 字符串截取(长文讲解)

更新时间:

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

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

截止目前, 星球 内专栏累计输出 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. LEFTRIGHT 函数

这两个函数专门用于从字符串的左侧或右侧截取指定长度的子串:

  • 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 | 只需截取右侧固定长度 | 固定从右侧开始|


二、进阶技巧:结合其他函数实现复杂截取

单纯的截取函数可能无法满足复杂需求,此时需要结合其他函数(如 LENGTHLOCATEINSTR 等)来实现更灵活的逻辑。

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_LENGTHCHAR_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 字符串截取技术是开发者处理数据时的重要工具。通过掌握 SUBSTRINGLEFTRIGHT 等基础函数,并结合 LOCATESUBSTRING_INDEX 等进阶方法,开发者可以灵活应对订单解析、URL 处理、多语言支持等场景。在实际应用中,需注意索引优化、多字节兼容性等问题,以确保代码的高效性和可维护性。希望本文能帮助读者在 MySQL 字符串截取领域建立起系统的认知,并在项目中游刃有余地应用这些技术。

最新发布