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+ 小伙伴加入学习 ,欢迎点击围观
前言
在数据库开发与数据处理中,字符串操作是一项高频需求。无论是解析用户输入、处理日志信息,还是从复杂字段中提取关键数据,MySQL 截取字符串的技巧都至关重要。对于编程初学者而言,掌握这些方法能显著提升数据处理效率;而对中级开发者来说,深入理解不同函数的特性与组合逻辑,能帮助解决更复杂的业务场景。本文将从基础语法到进阶技巧,系统讲解 MySQL 截取字符串 的核心知识点,并通过案例演示如何灵活应用这些技术。
一、基础函数:SUBSTRING 函数详解
1.1 SUBSTRING 的基本语法
SUBSTRING
是 MySQL 中最常用的字符串截取函数,其语法形式多样:
SUBSTRING(str, pos, len)
- str:目标字符串,可以是字段名、变量或直接字符串。
- pos:起始位置(注意:MySQL 的位置索引从
1
开始)。 - len:截取的长度(可选)。若省略,则截取从
pos
开始到字符串末尾的所有字符。
示例:
SELECT SUBSTRING('Hello World', 7, 5); -- 输出 'World'
SELECT SUBSTRING('Hello World', 7); -- 输出 'World'
1.2 负数位置的特殊含义
若 pos
为负数,则表示从字符串末尾开始倒数。例如:
SELECT SUBSTRING('Hello World', -5); -- 输出 'orld'(从末尾第5个字符开始,截取到末尾)
1.3 形象比喻:像剪刀一样裁剪字符串
想象 SUBSTRING
是一把裁剪纸张的剪刀:
pos
是剪刀切入的起始点,len
是剪裁的长度,- 若不指定长度,剪刀会一直剪到纸张边缘。
二、方向性截取:LEFT 和 RIGHT 函数
2.1 LEFT:从左向右截取固定长度
LEFT
函数从字符串左侧开始截取指定长度的字符:
SELECT LEFT('abcdefg', 3); -- 输出 'abc'
2.2 RIGHT:从右向左截取固定长度
RIGHT
函数则从右侧开始截取:
SELECT RIGHT('abcdefg', 3); -- 输出 'efg'
2.3 实际场景:处理用户输入
假设用户输入邮箱地址,需截取域名部分:
SELECT RIGHT('user@example.com', LENGTH('user@example.com') - INSTR('user@example.com', '@'));
-- 输出 'example.com'
这里结合了 INSTR
(查找字符位置)和 LENGTH
(字符串长度)函数,灵活组合实现目标。
三、定位关键点:LOCATE 和 POSITION 函数
3.1 定位子字符串的位置
LOCATE
和 POSITION
函数用于查找某个子字符串在目标字符串中的起始位置:
SELECT LOCATE('World', 'Hello World'); -- 输出 7
SELECT POSITION('World' IN 'Hello World'); -- 同样输出 7
3.2 负数位置的陷阱
与 SUBSTRING
不同,LOCATE
的返回值始终为正数,若未找到则返回 0
:
SELECT LOCATE('Java', 'Hello World'); -- 输出 0
3.3 综合案例:提取路径中的文件名
假设需从路径 /var/log/app/access.log
中提取 access.log
:
SELECT RIGHT(path, LENGTH(path) - LOCATE('/', path FROM 8));
-- 假设 path 字段存储路径,此语句可动态截取文件名
这里通过 LOCATE
定位最后一个 /
的位置,再结合 RIGHT
实现逆向截取。
四、进阶技巧:函数组合与模糊匹配
4.1 动态截取:结合 LOCATE 的位置信息
当需要截取某个分隔符后的子字符串时,可先定位分隔符位置,再传递给 SUBSTRING
:
SELECT SUBSTRING('user123', LOCATE('1', 'user123')); -- 输出 '123'
4.2 处理多分隔符场景:使用 SUBSTRING_INDEX
SUBSTRING_INDEX
函数专门用于按分隔符截取字符串,尤其适合 CSV 格式数据:
SELECT SUBSTRING_INDEX('a,b,c,d', ',', 2); -- 输出 'a,b'(取前两个部分)
SELECT SUBSTRING_INDEX('a,b,c,d', ',', -2); -- 输出 'c,d'(取后两个部分)
4.3 正则表达式:REGEXP_SUBSTR(MySQL 8.0+)
对于复杂模式匹配,可使用正则表达式函数:
SELECT REGEXP_SUBSTR('2023-09-15', '[0-9]{4}'); -- 输出 '2023'(匹配前4位数字)
五、常见问题与解决方案
5.1 截取中文字符时的乱码问题
MySQL 默认按字节处理字符串,若字段为 utf8mb4
编码(支持中文),需使用 CHAR_LENGTH
替代 LENGTH
:
SELECT SUBSTRING('你好世界', 3, 2); -- 以字符为单位截取,输出 '世界'
5.2 处理空值或 NULL 字段
在字段可能为 NULL
的情况下,先用 IFNULL
或 COALESCE
处理:
SELECT SUBSTRING(IFNULL(comment, ''), 1, 10) FROM users;
5.3 性能优化:避免重复计算
若需多次使用同一函数结果(如 LOCATE
的位置),建议先计算并存储为临时变量:
SET @pos = LOCATE('@', email);
SELECT SUBSTRING(email, @pos + 1) AS domain FROM users WHERE @pos > 0;
六、实战案例:电商订单数据处理
6.1 案例背景
假设订单表 orders
中有一个字段 order_id
格式为 ORD_YYYYMMDDNNNN
,需提取日期部分(如 20230915
)和序号部分(如 1234
)。
6.2 解决方案
SELECT
SUBSTRING(order_id, 5, 8) AS order_date,
SUBSTRING(order_id, 13) AS order_seq
FROM orders;
6.3 扩展需求:按日期分组统计
进一步统计每日订单量:
SELECT
SUBSTRING(order_id, 5, 8) AS order_date,
COUNT(*) AS total_orders
FROM orders
GROUP BY order_date
ORDER BY order_date DESC;
结论
通过本文的讲解,读者应能掌握 MySQL 截取字符串 的核心方法,并理解如何根据业务需求选择合适的函数组合。无论是基础的 SUBSTRING
、方向性截取的 LEFT/RIGHT
,还是复杂场景的 REGEXP_SUBSTR
,每种工具都有其适用场景。建议读者在实践中多尝试不同函数的组合,并结合实际数据验证逻辑的正确性。掌握这些技巧后,不仅能高效处理字符串数据,更能为后续的复杂业务逻辑打下坚实基础。
关键词布局提示:本文通过案例和函数对比,自然融入“mysql 截取字符串”关键词,确保内容与主题高度相关且符合 SEO 要求。