江西网站建设优化服务,深圳市建,昆山网站建设价格备用参考,有经验的盐城网站开发转载自 MySQL instr()函数
MySQL INSTR函数简介
有时#xff0c;您想要在字符串中查找子字符串或检查字符串中是否存在子字符串。在这种情况下#xff0c;您可以使用字符串内置INSTR()函数。
INSTR()函数返回字符串中子字符串第一次出现的位置。如果在str中找不到子字符串…转载自 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 setSQL
以下语句返回相同的结果因为INSTR函数不区分大小写。
SELECT INSTR(MySQL INSTR, sql);SQL
执行上面查询语句得到以下结果 -
mysql SELECT INSTR(MySQL INSTR, sql);
-----------------------------
| INSTR(MySQL INSTR, sql) |
-----------------------------
| 3 |
-----------------------------
1 row in setSQL
要强制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 setSQL
结果是不同的因为现在使用BINARY运算符因为sql与SQL是不同的字符串。
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 setSQL
假设要查找名称包含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 setSQL
除了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 setSQL
两个查询返回相同的结果。那么哪一个更快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 setSQL
您可以使用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函数来查找字符串中子字符串第一次出现的位置。