导读:本期聚焦于灯下变量创作的《SQL如何获取字符串首次出现的位置?LOCATE与CHARINDEX用法详解》,敬请观看详情。想在SQL查询里找出某个子字符串在长文本中第一次出现的位置,却不知道该用哪个函数?本文围绕MySQL的LOCATE和SQL Server的CHARINDEX这两个主流定位函数展开,介绍它们的基本语法、参数顺序、返回值规则以及和SUBSTRING配合截取字符串的实战技巧,同时对比两个数据库在函数行为上的差异,比如参数顺序不同、找不到时返回值不同等容易踩坑的点,帮助你根据所用数据库写出正确高效的定位查询语句。

在处理数据库中的文本字段时,经常需要知道某个子字符串在原始字符串中第一次出现的位置,比如从邮箱地址中提取域名、解析路径中的文件名、判断日志内容里是否包含特定关键字等。不同数据库提供了不同的定位函数,其中MySQL中的LOCATE和SQL Server中的CHARINDEX是最常用的两个。本文详细介绍这两个函数的语法、返回值规则以及实际应用场景。

SQL如何获取字符串首次出现的位置?LOCATE与CHARINDEX用法详解

一、MySQL中的LOCATE函数

LOCATE是MySQL提供的子字符串定位函数,它返回子字符串在目标字符串中首次出现的位置,位置从1开始计数。如果找不到子字符串,返回0;如果任一参数为NULL,则返回NULL。它的标准语法有两种形式:

-- 形式一:两个参数
LOCATE(substr, str)

-- 形式二:三个参数,pos表示从哪个位置开始搜索
LOCATE(substr, str, pos)

注意参数顺序是子字符串在前,目标字符串在后,这一点和SQL Server的CHARINDEX正好相反,也是跨数据库开发时最容易混淆的地方。举个例子:LOCATE('@', 'admin@ipipp.com')会返回7,因为@符号第一次出现在第7个字符的位置。

三参数形式在实际中非常有用。比如要找出字符串中第二次出现的位置,可以先定位第一次出现的位置,然后从它的下一位继续搜索:

SELECT LOCATE('a', 'banana') AS first_pos;             -- 返回 2
SELECT LOCATE('a', 'banana', LOCATE('a', 'banana') + 1) AS second_pos;  -- 返回 4

如果只是想判断某个字段是否包含关键字,LOCATE的返回值可以直接用在WHERE条件里,也可以结合INSTR或者LIKE使用。不过要提醒一句,对字段使用函数会导致索引失效,在大表上做这类查询时需要考虑性能影响。

二、SQL Server中的CHARINDEX函数

CHARINDEX是SQL Server对应的定位函数,功能类似但参数顺序相反。它的语法是CHARINDEX(expressionToFind, expressionToSearch, start_location),即要查找的内容在前,被搜索的字符串在后,第三个参数是可选的起始位置。返回值规则和LOCATE基本一致:找不到返回0,参数为NULL返回NULL。

SELECT CHARINDEX('@', 'admin@ipipp.com') AS pos;   -- 返回 7
SELECT CHARINDEX('a', 'banana', 3) AS pos;          -- 从位置3开始找,返回 4

CHARINDEX经常和SUBSTRING配合使用来拆分字符串。比如从一个完整邮箱中取出域名部分,思路是先定位@符号的位置,再从它的下一位截取到字符串末尾。SQL Server中可以用LEN函数获取总长度:

DECLARE @email VARCHAR(100) = 'admin@ipipp.com';

SELECT
    SUBSTRING(@email, CHARINDEX('@', @email) + 1, LEN(@email)) AS domain;
-- 结果为 ipipp.com

这个模式在数据清洗场景中非常常见,例如从文件路径中提取文件名、从URL中提取参数、从编码字段中提取编号段,本质上都是先定位分隔符再截取的思路。

三、两个函数的关键差异与常见坑

虽然两个函数解决的问题相同,但细节差异需要牢记。首先是参数顺序:LOCATE是LOCATE(substr, str),CHARINDEX是CHARINDEX(substr, str),看起来写法一致,但如果你在SQL Server里习惯性写了MySQL风格,函数不会报语法错误,却可能返回0,因为参数含义完全变了。其次是兼容性:SQL Server较新版本同时也支持CHARINDEX的常规用法,而MySQL中没有CHARINDEX,SQL Server中也没有LOCATE(但SQL Server提供PATINDEX作为补充,它支持通配符模式匹配)。

另一个容易忽略的点是大小写处理。MySQL默认排序规则不区分大小写,所以LOCATE('ABC', 'abc')通常返回1;而SQL Server的默认排序规则也可能不区分大小写,但如果字段或数据库设置了区分大小写的排序规则,结果就会不同。如果业务上需要明确的大小写行为,最好在查询前确认排序规则设置。

最后是多字节字符问题。对于中文等包含多字节字符的字符串,两个函数都按字符而非字节计数(前提是使用对应的字符集类型,如MySQL的utf8mb4),因此中文算作一个位置单位。下面用一个综合例子演示在MySQL中提取URL的域名部分:

SELECT
    SUBSTRING(
        url,
        LOCATE('//', url) + 2,
        LOCATE('/', url, LOCATE('//', url) + 2) - LOCATE('//', url) - 2
    ) AS domain
FROM web_pages;

这个写法先定位协议分隔符,再找到域名结束的第一个斜杠,最后计算出截取长度,是LOCATE嵌套使用的典型场景。掌握位置定位加子串截取这一组合,基本可以应对SQL中绝大部分字符串解析需求。

LOCATE函数CHARINDEXSQL字符串处理修改时间:2026-09-10 21:00:33

免责声明:已尽一切努力确保本网站所含信息的准确性。网站作品多为原创整理与精心创作,观点力求客观中立。本站旨在免费分享,内容仅供个人学习、研究或参考使用。若引用了第三方作品,版权归原作者所有。如内容涉及您的权益,请联系我们进行处理Email:chomcom@qq.com。
引用或转载本作品时,请注明当前出处:https://www.ipipp.com/html/0910/54264.html,基于非商业用途的前提下,欢迎转载或二创本作品。
内容垂直聚焦
专注技术核心技术栏目,确保每篇文章深度聚焦于实用技能。从代码技巧到架构设计,为用户提供无干扰的纯技术知识沉淀,精准满足专业提升需求。
知识结构清晰
覆盖从开发到部署的全链路。AI、前端、编程、数据库、服务器、建站、系统层层递进,构建清晰学习路径,帮助用户系统化掌握开发与运维所需的核心技术。
深度技术解析
拒绝泛泛而谈,深入技术细节与实践难点。无论是数据库优化还是服务器配置,均结合真实场景与代码示例进行剖析,致力于提供可直接应用于工作的解决方案。
专业领域覆盖
精准对应开发生命周期。从前端界面到后端编程,从数据库操作到服务器运维,形成完整闭环,一站式满足全栈工程师和运维人员的技术需求。
即学即用高效
内容强调实操性,步骤清晰、代码完整。用户可根据教程直接复现和应用于自身项目,显著缩短从学习到实践的距离,快速解决开发中的具体问题。
持续更新保障
专注既定技术方向进行长期、稳定的内容输出。确保各栏目技术文章持续更新迭代,紧跟主流技术发展趋势,为用户提供经久不衰的学习价值。