在进行 MySQL 数据库操作时,我们经常需要从已存储的字符串中提取指定内容,例如从用户全名中截取姓氏,或者从日期字符串中获取年份等。MySQL 提供了 SUBSTRING() 和 MID() 两个常用字符串函数,它们的功能几乎一致,都是用于从字符串中精准截取子串。下面将详细介绍这两个 MySQL 字符串截取函数的语法、参数说明以及常见实际应用场景。

一、SUBSTRING()和MID()函数的基本语法
1.SUBSTRING()函数
SUBSTRING() 函数的基本语法如下:
SUBSTRING(str, pos, len)
str:要进行截取操作的原始字符串。pos:子串开始截取的位置(注意:MySQL 中的位置索引从 1 开始,而不是从 0 开始)。len:(可选)要截取的子串长度。如果省略该参数,SUBSTRING()函数会返回从pos位置开始直到字符串末尾的全部内容。
2.MID()函数
MID() 函数的基本语法与 SUBSTRING() 完全相同:
MID(str, pos, len)
- 各参数含义与
SUBSTRING()中保持一致。
注意事项
- 如果
pos参数小于 1,那么SUBSTRING()和MID()都会返回空字符串。 - 如果
pos参数大于原字符串长度,函数同样会返回空字符串。 - 如果
len参数小于 0,函数也会返回空字符串。
二、实际应用场景
1. 从用户全名中提取姓氏
假设有一张用户表 users,其中包含字段 fullname,用于存储用户姓名(如"张三丰")。如果你希望从完整姓名中提取姓氏(假设姓氏始终为第一个字),可以使用 SUBSTRING() 或 MID() 函数:
SELECT SUBSTRING(fullname, 1, 1) AS surname FROM users;-- 或者SELECT MID(fullname, 1, 1) AS surname FROM users;
执行后将返回每位用户姓名中的姓氏部分,在这个示例里就是第一个字符。
2. 从日期字符串中提取年份
假设存在一个订单表 orders,其中字段 order_date 用于保存订单日期,格式为 "YYYY-MM-DD"。如果需要从日期字符串中提取年份,可以这样写:
SELECT SUBSTRING(order_date, 1, 4) AS order_year FROM orders;-- 或者SELECT MID(order_date, 1, 4) AS order_year FROM orders;
这样即可返回每条订单记录对应的年份信息。
3. 截取字符串的特定部分
假设你有一个文章内容字段 content,并希望从每篇文章中截取前 100 个字符作为摘要或预览。此时可以使用 SUBSTRING() 或 MID() 函数,并根据需要结合 LENGTH() 或 CHAR_LENGTH() 函数(当你需要按字符数而非字节数处理时尤其有用)来实现:
SELECT SUBSTRING(content, 1, 100) AS preview FROM articles;-- 或者SELECT MID(content, 1, 100) AS preview FROM articles;
需要注意的是,如果文章内容本身不足 100 个字符,那么这两个函数会直接返回完整内容,而不会报错。
三、总结
SUBSTRING()和MID()在 MySQL 中都可用于提取字符串中的子串,二者用法几乎完全一致。至于使用哪一个,通常取决于个人习惯或团队开发规范。在其他数据库系统中,例如 Oracle,更常见的是SUBSTR(),但在 MySQL 里,SUBSTRING()与MID()可以视为等效写法。- 在使用这两个 MySQL 字符串函数时,一定要注意字符串位置是从 1 开始计算的,这一点会直接影响截取结果。同时,如果省略
len参数,函数默认会从pos指定位置一直截取到字符串结尾。
总体来看,在 MySQL 数据库开发和 SQL 查询处理中,SUBSTRING() 和 MID() 是非常实用的字符串处理函数,尤其适合完成字符串截取、字段内容提取、文本预览生成等任务。它们的语法清晰、使用便捷,只需要指定起始位置和长度,就能快速获取目标子串。无论是处理用户姓名、订单日期,还是文章内容摘要,熟练掌握这两个函数的用法,都能显著提升你在 MySQL 字符串处理与数据库操作中的效率。
