首页/ 诗词歌赋/ 正文
📎 本文网址 http://8317.geci.2211mu.com/858

MySQL字符串截取拆分函数实战:substring、trim与regex用法解析

✍️ 作者:历史事件 👁 阅读 2,358 💬 评论 36 ⏱ 阅读约 6 分钟

MySQL字符串截取拆分函数实战:substring、trim与regex用法解析

一、截取字符串核心函数:left、right与substring

在数据库开发中,字符串截取是最常见的操作之一。面对“取字段前三位”“截取中间片段”“从右侧提取指定长度”等需求,MySQL提供了left、right、substring等多个函数,但很多开发者对各函数的参数差异和边界行为并不清楚。

left与right:快速获取首尾字符

left(str, length)从左侧截取指定长度,right(str, length)从右侧截取指定长度。两者语法简单,非常适合直接取前缀或后缀的场景。

-- 取左侧3个字符
SELECT left('example.com', 3);  -- 返回 'exa'

-- 取右侧3个字符
SELECT right('example.com', 3); -- 返回 'com'

实际应用中,可以通过right函数快速提取字符串字段的后几位,并更新到新字段:

UPDATE historydata SET last2 = right(last3, 2);

substring:灵活的中段截取

substring(str, pos, len)从指定位置pos开始截取len长度的字符。MySQL中起始位置必须从1开始,如果从0开始将无法获取数据。substring的变体substr和mid与之等价,功能完全相同。

-- 从第3位开始截取2个字符
SELECT substring('example.com', 3, 2); -- 返回 'am'

二、substring与Oracle substr的差异陷阱

很多从Oracle迁移到MySQL的开发者都会掉进同一个坑:Oracle的substr允许起始位置从0开始,并且0和1的效果相同;而MySQL的substring从0开始会返回空字符串。这一差异在跨数据库移植时极易导致数据结果不一致。

例如同样执行substr('abc', 0, 2),Oracle返回'ab',MySQL返回空。因此在MySQL中务必牢记:起始位置从1开始

三、RANGE分区中字符串字段的划分技巧

MySQL RANGE分区遇到字符串字段时,需要为每个分区指定VALUES LESS THAN的边界值。如果已经设置了MAXVALUE分区,后续再添加新分区就必须重新定义整个分区表。

ALTER TABLE emp PARTITION BY RANGE (salary) (
  PARTITION p1 VALUES LESS THAN (2000),
  PARTITION p2 VALUES LESS THAN (4000),
  PARTITION p3 VALUES LESS THAN MAXVALUE
);

对于字符串字段,建议预先规划好边界值,尽量使用字符串前缀或hash分区,避免后期频繁重建分区带来的性能开销。

四、trim函数使用细节与常见误区

清洗数据时,trim函数可以过滤指定字符串。完整格式为:TRIM([{BOTH | LEADING | TRAILING} [remstr] FROM] str),默认情况下移除字符串两侧的空格。

trim的三种模式

  • LEADING:只删除开头指定的字符
  • TRAILING:只删除结尾指定的字符
  • BOTH:同时删除开头和结尾指定的字符(默认)
-- 去除两边空格
SELECT TRIM('  bar   ');                       -- 'bar'

-- 删除指定首字符
SELECT TRIM(LEADING 'x' FROM 'xxxbarxxx');     -- 'barxxx'

-- 删除指定首尾字符
SELECT TRIM(BOTH 'x' FROM 'xxxbarxxx');        -- 'bar'

-- 删除指定尾字符
SELECT TRIM(TRAILING 'xyz' FROM 'barxxyz');    -- 'barx'

ltrim与rtrim的补充用法

MySQL还提供了LTRIM(str)RTRIM(str)分别去除左空格和右空格,适用于只需处理单侧空格的场景。

SELECT LTRIM('  barbar');  -- 'barbar'
SELECT RTRIM('barbar   '); -- 'barbar'

五、regex正则表达式函数在MySQL中的典型应用

除了基础字符串函数,MySQL正则表达式函数在复杂模式匹配和替换中发挥着巨大作用。MySQL 8.0提供了REGEXP_LIKE、REGEXP_REPLACE、REGEXP_INSTR、REGEXP_SUBSTR等函数,可用于查找、替换、提取和验证数据。

常用正则函数场景

  • 模式匹配:REGEXP_LIKE(str, pattern) 判断字符串是否满足正则规则
  • 替换文本:REGEXP_REPLACE(str, pattern, replacement) 将匹配到的内容替换为指定字符串
  • 提取子串:REGEXP_SUBSTR(str, pattern) 返回第一个匹配的子字符串
  • 定位匹配位置:REGEXP_INSTR(str, pattern) 返回匹配内容首次出现的位置

例如,要从“商品编号A-12345”中提取纯数字部分,可以使用REGEXP_SUBSTR:

SELECT REGEXP_SUBSTR('商品编号A-12345', '[0-9]+'); -- 返回 '12345'

需要注意的是,正则表达式函数对性能有一定影响,在大数据量查询中应谨慎使用,尽量配合其他条件过滤缩小数据集。

掌握这些函数的正确用法,可以大幅提升SQL处理字符串的效率。实际开发中,应根据MySQL版本选择合适的语法,注意起始位置、边界条件和分区限制,让数据处理更加精准稳定。

⚠ 温馨提示:知识看完了,记得站起来活动一下,喝杯水,看看窗外——好身体和好奇心一样重要。
📌 声明:本文内容仅供参考,具体操作请咨询专业人士。