首页 >> 甄选问答 >

问sql 中 substring 字符串截取函数详解

2026-11-12 16:48:38

答

sql 中的 substring 是字符串截取函数,作用就是从一段文本里面,按照指定起始位置和长度,把需要的子字符串提取出来,这个函数经常用来处理身份证号手机号编码字段,拆分固定格式文本,清洗脏数据,生成新的派生字段,MySQL sqlite3 都支持 substring,Oracle 对应的函数名字是 substr,SQL Server 同时兼容 substring 和 substr,很多新手容易踩坑的点是起始下标从 1 开始,不是编程语言里面常见的 0 开始,这个是 sql 字符串函数很特殊的地方,另外不同数据库对长度参数省略,负数起始位置的处理规则不一样,写跨库 SQL 的时候要特别留意,substring 一般搭配 select 语句使用,也可以写在 where 条件,update 赋值表达式里面,是文本类数据处理非常高频的内置函数。

基础语法结构

substring 字符串 起始位置 截取长度

参数说明

第一个参数 待处理的原始字符串,可以是表里面的字段,也可以是写死的文本常量

第二个参数 起始位置,sql 里面下标默认从 1 计数,1 代表字符串第一个字符

第三个参数 截取长度,代表从起始位置开始一共提取多少个字符,部分数据库这个参数可以省略,省略之后会一直截取到字符串末尾

基础示例

select substring 123456 1 3

结果就是 123,从第一个字符开始,一共截取 3 个字符

字段截取示例

select substring idcard 7 8 from user

含义是从 user 表的 idcard 身份证字段,从第 7 位开始截取 8 位,也就是提取出生日期部分

跨数据库名称对照表

数据库函数名称备注
MySQLsubstring substr两个函数用法完全等价
sqlite3substring substr支持相同参数写法
SQL Serversubstring推荐使用 substring
OraclesubstrOracle 没有 substring 这个名称

进阶用法

搭配 where 条件筛选

select name from user where substring phone 1 3 = 138

含义是筛选手机号前三位等于 138 的用户记录,这种写法可以做号段筛选,但是要注意,如果 phone 字段建立索引,这种对字段使用函数的写法会造成索引失效,大表查询性能会下降

搭配 update 更新数据

update user set shortcode = substring code 1 4

含义是把 code 字段前四位截取出来,写入 shortcode 新字段,适合批量清洗生成编码

嵌套其他字符串函数

substring 可以和 concat trim replace 这类函数嵌套组合,实现复杂文本处理,比如先 trim 去除空格,再做 substring 截取

深度注意要点

第一点 下标起点,sql substring 是从 1 开始计数,和 Python C 语言从 0 开始不一样,这是最常见报错原因,很多人写 0 导致截取结果为空或者不符合预期

第二点 起始位置大于字符串总长度,函数返回空字符串,不会抛出严重报错,业务代码要判断空值

第三点 截取长度超过剩余字符数量,函数只会截取剩下全部字符,不会报错

第四点 中文汉字,在 utf8 编码环境,substring 是按字符计数,不是按字节计数,这点要和按字节截取的函数区分开

第五点 索引失效,只要在 where 条件里面对字段调用 substring,数据库一般无法直接使用原字段索引,大表场景需要提前评估性能

使用 substring 编写 SQL 操作步骤

第一步 确认目标字段,确认需要截取的起始位置和需要提取的字符数量

第二步 核对数据库类型,确认是使用 substring 还是 substr,避免函数名报错

第三步 单独写 select 测试截取结果,确认截取内容正确之后,再放到 where 或者 update 语句

第四步 大表场景评估索引影响,如果必须使用 substring 筛选,考虑生成冗余字段并建立索引

第五步 处理边界情况,确认原字段为 null 的时候,substring 返回 null,业务逻辑需要提前做空值判断

第六步 正式执行业务 SQL,执行完成核对返回或者更新的数据是否符合预期

整体总结,sql 中的 substring 核心功能就是按起始位置和长度截取字符串,下标从 1 开始,MySQL 和 sqlite3 同时支持 substring 与 substr,Oracle 只支持 substr,它适合固定格式编码拆分,号段筛选,文本清洗,缺点是在 where 条件使用会让索引失效,大数据量表慎用,跨数据库迁移 SQL 的时候,优先检查函数名称和参数规则差异。

【常见问题】

问题 1 sql 中 substring 起始位置是从 0 开始吗

回答 1 sql 中 substring 起始位置不是从 0 开始,是从 1 开始计数,第一个字符对应的位置就是 1,这是 sql 中 substring 最容易记错的知识点。

问题 2 sql 中 substring 和 substr 是同一个函数吗

回答 1 sql 中 substring 在 MySQL 和 sqlite3 里面和 substr 功能等价,但是 Oracle 只识别 substr,学习 sql 中 substring 跨库使用的时候要注意函数名称差异。

问题 3 sql 中 substring 写在 where 条件为什么查询变慢

回答 1 sql 中 substring 作用在字段上,会让原本字段上的索引失效,变成全表扫描,所以大表使用 sql 中 substring 做筛选会明显变慢。

问题 4 sql 中 substring 可以截取中文吗

回答 1 sql 中 substring 在 utf8 环境是按字符截取,可以正常截取中文汉字,不是按字节计算,这是 sql 中 substring 处理中文文本需要了解的特性。

【免责申明】

本文内容仅作为 SQL 函数学习参考,不同数据库版本对 substring 负数参数等特殊规则存在差异,生产环境请以目标数据库官方文档为准,大表使用函数筛选请提前测试性能。

 

相关阅读

标签: sql中substring
最新文章