转载自  MySQL instr()函数

MySQL INSTR函数简介

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

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

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

INSTR(str,substr);

SQL

INSTR函数接受两个参数:

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

INSTR()函数不区分大小写。这意味着如果通过小写,大写,标题大小写等,结果总是一样的。

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

MySQL INSTR函数示例

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

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

SQL

执行上面查询语句,得到以下结果 -

mysql> SELECT INSTR('MySQL INSTR', 'SQL');
+-----------------------------+
| INSTR('MySQL INSTR', 'SQL') |
+-----------------------------+
|                           3 |
+-----------------------------+
1 row in set

SQL

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

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

SQL

执行上面查询语句,得到以下结果 -

mysql> SELECT INSTR('MySQL INSTR', 'sql');
+-----------------------------+
| INSTR('MySQL INSTR', 'sql') |
+-----------------------------+
|                           3 |
+-----------------------------+
1 row in set

SQL

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

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

SQL

执行上面查询语句,得到以下结果 -

mysql> SELECT INSTR('MySQL INSTR', BINARY 'sql');
+------------------------------------+
| INSTR('MySQL INSTR', BINARY 'sql') |
+------------------------------------+
|                                  0 |
+------------------------------------+
1 row in set

SQL

结果是不同的,因为现在使用BINARY运算符,因为sqlSQL是不同的字符串。

INSTR函数与LIKE运算符

我们将使用示例数据库(yiibaidb)中的products表,其表结构如下 -

mysql> desc products;
+--------------------+---------------+------+-----+---------+------------------+
| Field              | Type          | Null | Key | Default | Extra            |
+--------------------+---------------+------+-----+---------+------------------+
| productCode        | varchar(15)   | NO   | PRI |         |                  |
| productName        | varchar(70)   | NO   | MUL | NULL    |                  |
| productLine        | varchar(50)   | NO   | MUL | NULL    |                  |
| productScale       | varchar(10)   | NO   |     | NULL    |                  |
| productVendor      | varchar(50)   | NO   |     | NULL    |                  |
| productDescription | text          | NO   |     | NULL    |                  |
| quantityInStock    | smallint(6)   | NO   |     | NULL    |                  |
| buyPrice           | decimal(10,2) | NO   |     | NULL    |                  |
| MSRP               | decimal(10,2) | NO   |     | NULL    |                  |
| stockValue         | double        | YES  |     | NULL    | STORED GENERATED |
+--------------------+---------------+------+-----+---------+------------------+
10 rows in set

SQL

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

SELECT productName
FROMproducts
WHEREINSTR(productname,'Car') > 0;

SQL

执行上面查询语句,得到以下结果 -

+----------------------------------------+
| productName                            |
+----------------------------------------+
| 1911 Ford Town Car                     |
| 1999 Indy 500 Monte Carlo SS           |
| 18th Century Vintage Horse Carriage    |
| 1917 Maxwell Touring Car               |
| 1950s Chicago Surface Lines Streetcar |
| 1962 City of Detroit Streetcar         |
+----------------------------------------+
6 rows in set

SQL

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

SELECT productname
FROMproducts
WHEREproductname LIKE '%Car%';

SQL

执行上面查询语句,得到以下结果 -

+----------------------------------------+
| productname                            |
+----------------------------------------+
| 1911 Ford Town Car                     |
| 1999 Indy 500 Monte Carlo SS           |
| 18th Century Vintage Horse Carriage    |
| 1917 Maxwell Touring Car               |
| 1950s Chicago Surface Lines Streetcar |
| 1962 City of Detroit Streetcar         |
+----------------------------------------+
6 rows in set

SQL

两个查询返回相同的结果。那么哪一个更快,INSTR还是LIKE操作符?

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

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

CREATE INDEX idx_products_name ON products(productname);

SQL

如果您使用具有前缀搜索的LIKE运算符,则在此索引列上,LIKE运算符的执行速度要比INSTR函数快。

请参阅以下查询语句 -

SELECT productname
FROMproducts
WHEREproductname LIKE '1900%';

SQL

执行上面查询语句,得到以下结果 -

+-------------------------+
| productname             |
+-------------------------+
| 1900s Vintage Bi-Plane  |
| 1900s Vintage Tri-Plane |
+-------------------------+
2 rows in set

SQL

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

EXPLAIN SELECT productname
FROMproducts
WHEREproductname LIKE '1900%';

SQL

执行查询分析,得到以下结果 -

下面使用INSTR函数执行查询分析,以进行比较,参考以下语句 -

EXPLAIN SELECT productname
FROMproducts
WHEREinstr(productname,'1900');

SQL

执行查询分析,得到以下结果 -

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

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

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

MySQL instr()函数相关推荐

  1. MySQL INSTR函数简介

    MySQL INSTR函数简介 有时,您想要在字符串中查找子字符串或检查字符串中是否存在子字符串.在这种情况下,您可以使用字符串内置INSTR()函数. INSTR()函数返回字符串中子字符串第一次出 ...

  2. instr函数 mysql_MySQL数据库下 INSTR函数功能简介说明

    摘要: 下文讲述MySQL数据库下INSTR函数的功能及举例说明,如下所示: MySQL INSTR 功能及语法说明 INSTR 函数功能,返回指定字符串在源字符串的起始位置 INSTR 函数语法: ...

  3. oracle调用MySQL函数,Oracle的INSTR函数MySQL实现

    Oracle的INSTR函数MySQL实现 一个迁移项目遇到的,MySQL的instr函数只能查找子串是否在父串中,没法按照出现的次数进行查找.这里我自己写了一个,以便迁移.当然我这里仅仅针对的是迁移 ...

  4. mysql instr locate_mysql函数之一:INSTR、LOCATE、POSITION VS LIKE

    LOCATE.POSITION和INSTR函数相似功能实例 使用LOCATE.POSITION和INSTR函数查找字符串中指定子字符串的开始位置.SQL语句如下: mysql>SELECT LO ...

  5. oracle instr和mysql_Oracle 的INSTR函数MySQL实现

    一个迁移项目遇到的,MySQL的instr函数只能查找子串是否在父串中,无法按照出现的次数进行查找. 这里我本身写了一个,以便迁移.固然我这里仅仅针对的是迁移,可能没有彻底实现原有函数的细节. Ora ...

  6. Mysql的instr()函数用法

    mysql的内置函数instr(filed,str),作用是返回str子字符串在filed字符串的第一次出现的位置,如果没有找到,则返回0.备注:位置是从1开始的.函数不区分大小写.当instr(fi ...

  7. mysql自定义函数应用_mysql functions实例:在自定义函数中应用字符串函数

    分享一段mysql自定义函数的代码,在其中用到了mysql的字符串函数length. 代码: mysql> delimiter $$ mysql> CREATE FUNCTION myFu ...

  8. mysql常用函数参考

    mysql常用函数参考 对于针对字符串位置的操作,第一个位置被标记为1. ASCII(str) 返回字符串str的最左面字符的ASCII代码值.如果str是空字符串,返回0.如果str是NULL,返回 ...

  9. oracle取第一位,Oracle中的substr()函数和INSTR()函数

    1)substr函数格式   (俗称:字符截取函数) 格式1: substr(string string,int a,int b); 格式2:substr(string string,int a) ; ...

最新文章

  1. nginx php 大小写问题,Nginx实现url请求不区分大小写
  2. 用数学范畴定义生命的尝试
  3. java创建一个图片_Java 创建一个简单的验证码图片
  4. /dev/sda2占用100%、磁盘占用100%的怎么解决?
  5. 【Python3网络爬虫开发实战】6.4-分析Ajax爬取今日头条街拍美图
  6. Spring Cloud 中的@FeignClient注解
  7. php在线编辑器_8款功能强大的Java编辑器,建议收藏!「渡一教育」
  8. 从虚拟化到软件定义--重新定义IT产业格局
  9. matlab挠率算法,中国科学院沈阳自动化研究所
  10. 【元胞自动机】基于元胞自动机模拟交通流仿真含Matlab源码
  11. SNMP-简单网络管理协议
  12. python雷达算法实现_一种基于Python的雷达信号处理系统及方法与流程
  13. gb28181简单实现sip信令服务器(java版基于springboot):二、sip摄像头注册(信令解读)
  14. python进程间通信时间开销_python 进程间的通信
  15. RPG Maker MV 计时器的用法
  16. 用谷歌按钮登录_使用非常简单的设置即可登录Google的按钮
  17. 爬取网页表格到Excel ?别再复制粘贴了,太慢!
  18. 京东数据中心设施运维管理(三)
  19. java中print()和println()的区别
  20. 第8周 项目5 定期存款利息计算器

热门文章

  1. 后端学习 - JavaWeb
  2. 剑指 Offer 05. 替换空格(两种做法)
  3. 695.岛屿的最大面积(026)BFS
  4. 矩阵模拟问题合集(Leetcode题解-Python语言)
  5. LeetCode100 相同的树-简单
  6. TCP四次握手释放连接
  7. Codeforces Round #163 (Div. 2) C. Below the Diagonal 分治
  8. 【NOI2015】品酒大会【后缀数组】【并查集】
  9. CF1208D Restore Permutation
  10. [CCO 2019] Sirtet(差分约束+最短路)