首页/数据/SQL 速查/LOCATE / INSTR / POSITION 子串定位
本包目录(311 条)
查询基础33 条连接与子查询40 条聚合与窗口函数54 条
函数速查60 条
变更与事务52 条性能与执行计划72 条

LOCATE / INSTR / POSITION 子串定位

返回子串首次出现的位置(找不到返回 0 或 NULL 视函数而定):三个函数参数顺序不同,是常见的抄错点。

SQL 速查数据更新于 2026-10-12

MySQL

MySQL
SELECT LOCATE('lo', 'hello');        -- 3(子串在前)
SELECT INSTR('hello', 'lo');        -- 3(子串在后)
SELECT LOCATE('l', 'hello', 5);     -- 0(从位置 5 起找)

PostgreSQL

PostgreSQL
SELECT strpos('hello', 'lo');           -- 3
SELECT position('lo' in 'hello');        -- 3
MySQLLOCATE(sub, str[, pos]) / INSTR(str, sub) / POSITION(sub IN str)
PostgreSQLstrpos(str, sub) / position(sub in str)
未命中都返回 0(注意不是 NULL)
MySQL 的定位函数受排序规则影响:_ci 排序下 LOCATE('A','abc') 返回 1;PostgreSQL 始终区分大小写。

易错点

  • 把 INSTR 和 LOCATE 的参数顺序互换后不报错但结果错(一个找不到返回 0,静默出错)
  • 用 LIKE CONCAT('%', kw, '%') 与定位函数混用时注意 COLLATE,大小写敏感度来源不同

数据来源与参考

  • MySQL 8.0 Reference Manual · String Functions
  • PostgreSQL Documentation · String Functions and Operators
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌