MySQL INSTR函数

时间:2019-11-20 08:52:24  来源:igfitidea点击:

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

MySQL INSTR函数简介

有时,您想在字符串中找到子字符串,或者检查字符串中是否存在子字符串。
在这种情况下,您可以使用称为INSTR的字符串内置函数。

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

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

INSTR(str,substr);

INSTR函数接受两个参数:

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

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

INSTR函数不区分大小写。
这意味着是否传递小写字母,大写字母,标题大写字母等都没有关系,结果始终相同。

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

MySQL INSTR函数示例

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

SELECT INSTR('MySQL INSTR', 'MySQL');

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

SELECT INSTR('MySQL INSTR', 'mysql');

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

SELECT INSTR('MySQL INSTR', BINARY 'mysql');

结果是不同的,因为mysql和MySQL现在有了BINARY运算符。

INSTR函数与LIKE运算符

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

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

SELECT 
    productName
FROM
    products
WHERE
    INSTR(productname,'Car') > 0;

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

SELECT 
    productname
FROM
    products
WHERE
    productname LIKE '%Car%';

这两个查询返回相同的结果。
那么INSTR或LIKE运算符中哪个更快?

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

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

CREATE INDEX idx_products_name ON products(productname);

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

请参阅以下语句。

SELECT 
    productname
FROM
    products
WHERE
    productname LIKE '1900%';

您可以使用EXPLAIN语句检查它:

EXPLAIN SELECT 
    productname
FROM
    products
WHERE
    productname LIKE '1900%';

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

EXPLAIN SELECT 
    productname
FROM
    products
WHERE
    instr(productname,'1900');

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

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

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