MySQL INSTR Function

摘要:本教程向您展示如何使用 MySQL INSTR 函数返回字符串第一次出现的位置。

MySQL INSTR函数简介

有时,您想要在字符串中定位子字符串或检查字符串中是否存在子字符串。在这种情况下,您可以使用名为INSTR字符串内置函数。

INSTR函数返回字符串中子字符串第一次出现的位置。如果在 str 中未找到子字符串,则INSTR函数返回零 (0)。

下面说明了INSTR函数的语法。

INSTR(str,substr);Code language: SQL (Structured Query Language) (sql)

试试看

INSTR函数接受两个参数:

  • str是您要搜索的字符串。
  • substr是您要搜索的子字符串。

INSTR函数不区分大小写。这意味着无论你传递小写、大写、标题大小写等,结果总是相同的。

如果希望INSTR函数以区分大小写的方式对非二进制字符串执行搜索,则可以使用BINARY运算符将INSTR函数的参数从非二进制字符串转换为二进制字符串。

MySQL INSTR 函数示例

以下语句返回MySQL INSTR字符串中子字符串 MySQL 的位置。

SELECT INSTR('MySQL INSTR', 'MySQL');Code language: SQL (Structured Query Language) (sql)

试试看

MySQL INSTR 示例

以下语句返回相同的结果,因为INSTR函数不区分大小写。

SELECT INSTR('MySQL INSTR', 'mysql');Code language: SQL (Structured Query Language) (sql)

试试看

要强制INSTR函数基于区分大小写的方式进行搜索,请使用BINARY运算符,如下所示:

SELECT INSTR('MySQL INSTR', BINARY 'mysql');Code language: SQL (Structured Query Language) (sql)

试试看

MySQL INSTR case-sensitive example

结果不同,因为 mysql 与 MySQL 现在使用了BINARY运算符。

INSTR 函数与 LIKE 运算符

我们将使用示例数据库中的products表。

Products table

假设要查找名称中包含car关键字的产品,可以使用INSTR函数,如下所示:

SELECT 
    productName
FROM
    products
WHERE
    INSTR(productname,'Car') > 0;Code language: SQL (Structured Query Language) (sql)

试试看

MySQL INSTR in WHERE clause

除了INSTR函数之外,您还可以使用LIKE运算符来匹配Car模式。

SELECT 
    productname
FROM
    products
WHERE
    productname LIKE '%Car%';Code language: SQL (Structured Query Language) (sql)

试试看

两个查询返回相同的结果。那么INSTRLIKE运算符哪一个更快呢?

答案是它们是相同的。它们都区分大小写并执行全表扫描。

让我们在productname列上创建一个索引。

CREATE INDEX idx_products_name ON products(productname);Code language: SQL (Structured Query Language) (sql)

试试看

如果将LIKE运算符与前缀搜索结合使用,则在此索引列上, LIKE运算符的执行速度将快于INSTR函数。

请参阅以下声明。

SELECT 
    productname
FROM
    products
WHERE
    productname LIKE '1900%';Code language: SQL (Structured Query Language) (sql)

试试看

MySQL INSTR vs LIKE

您可以使用EXPLAIN语句进行检查:

EXPLAIN SELECT 
    productname
FROM
    products
WHERE
    productname LIKE '1900%';Code language: SQL (Structured Query Language) (sql)

试试看

MySQL INSTR LIKE with INDEX

并与以下使用INSTR函数的语句进行比较。

EXPLAIN SELECT 
    productname
FROM
    products
WHERE
    instr(productname,'1900');Code language: SQL (Structured Query Language) (sql)

试试看

MySQL INSTR 与 INDEX

即使productname列有索引, INSTR函数也会执行表扫描。这是因为 MySQL 无法对INSTR函数的语义做出任何假设,而 MySQL 可以利用其对LIKE运算符语义的理解。

测试字符串中是否存在子字符串的最快方法是使用全文索引。但是,需要正确配置和维护索引。

在本教程中,您学习了如何使用INSTR函数查找字符串中子字符串第一次出现的位置。

本教程有帮助吗?