MySQL instr()函數

本教程將向您展示如何使用MySQL INSTR()函數返回字串第一次出現的位置。

MySQL INSTR函數簡介

有時,您想要在字串中查找子字串或檢查字串中是否存在子字串。在這種情況下,您可以使用字串內置INSTR()函數。

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

下麵說明了INSTR函數的語法。

INSTR(str,substr);

INSTR函數接受兩個參數:

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

INSTR()函數不區分大小寫。這意味著如果通過小寫,大寫,標題大小寫等,結果總是一樣的。

如果希望INSTR函數在非二進位字串上以區分大小寫的方式執行搜索,則可以使用BINARY運算符將INSTR函數的參數從非二進位字串轉換為二進位字串。

MySQL INSTR函數示例

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

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

執行上面查詢語句,得到以下結果 -

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

以下語句返回相同的結果,因為INSTR函數不區分大小寫。

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

執行上面查詢語句,得到以下結果 -

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

要強制INSTR函數根據以區分大小寫的方式進行搜索,請按如下所示使用BINARY運算符:

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

執行上面查詢語句,得到以下結果 -

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

結果是不同的,因為現在使用BINARY運算符,因為sqlSQL是不同的字串。

INSTR函數與LIKE運算符

我們將使用示例資料庫(zaixiandb)中的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

假設要查找名稱包含car關鍵字的產品,可以使用INSTR函數,如下所示:

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

執行上面查詢語句,得到以下結果 -

+----------------------------------------+
| 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

除了INSTR函數,可以使用LIKE運算符來匹配Car模式。

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

執行上面查詢語句,得到以下結果 -

+----------------------------------------+
| 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

兩個查詢返回相同的結果。那麼哪一個更快,INSTR還是LIKE操作符?

答案是它們是一樣的,它們都區分大小寫,並執行全表掃描。

讓我們在productname列創建一個索引。

CREATE INDEX idx_products_name ON products(productname);

如果您使用具有首碼搜索的LIKE運算符,則在此索引列上,LIKE運算符的執行速度要比INSTR函數快。

請參閱以下查詢語句 -

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

執行上面查詢語句,得到以下結果 -

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

您可以使用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函數來查找字串中子字串第一次出現的位置。


上一篇: MySQL函數 下一篇: MySQL+Node.js連接和操作