![MariaDB必知必会](https://wfqqreader-1252317822.image.myqcloud.com/cover/943/34339943/b_34339943.jpg)
上QQ阅读APP看书,第一时间看更新
9.2.1 基本字符匹配
我们从简单的例子开始。下面的语句检索列prod_name包含文本1000的所有行:
▼ 输入
![](https://epubservercos.yuewen.com/AE5E39/18365861508119506/epubprivate/OEBPS/Images/47-i.jpg?sign=1739689602-oxJf2U88ORIrfbouAw9QF9K207MP09hV-0-e39f4c83ae4e6734879dcdbb49b84ccf)
▼ 输出
![](https://epubservercos.yuewen.com/AE5E39/18365861508119506/epubprivate/OEBPS/Images/47a-i.jpg?sign=1739689602-yORj5nuV3LpC8EpvR2uABvGjOIjnQdxi-0-5f4bd1dbce3da6eac9374b0efafbf833)
▼ 分析
这个语句看起来像我们使用的LIKE语句(见第8章),除了关键字LIKE被替换为REGEXP。它告知MariaDB接下来的内容被当作正则表达式处理(仅仅匹配文字文本1000)。
那么,为什么还要这么麻烦地使用正则表达式呢?好吧,像在刚才这个例子中,使用正则表达式确实没有什么价值(而且可能会影响性能),然而如果考虑下面这个例子:
▼ 输入
![](https://epubservercos.yuewen.com/AE5E39/18365861508119506/epubprivate/OEBPS/Images/47b-i.jpg?sign=1739689602-izuKV7AYo3em7HhJqWOSFURMEDDLrfS4-0-394205ca8284c2c22be1f8c0a5d7055a)
▼ 输出
![](https://epubservercos.yuewen.com/AE5E39/18365861508119506/epubprivate/OEBPS/Images/48-i.jpg?sign=1739689602-uTfgdKSt9xhSYkESaQeGapHYkrhCmCn6-0-d9479937d3ce784d046d661418a57729)
▼ 分析
这里使用了正则表达式“.000”。“.”是正则表达式语言中的一个特殊字符。它代表任意一个字符,因此1000和2000都能匹配,并且被返回。
当然,这个特殊的例子也可以用LIKE和通配符实现(如第8章所示)。
注意
LIKE和REGEXP LIKE和REGEXP有一个重要的不同点,看下面的两个语句:
![](https://epubservercos.yuewen.com/AE5E39/18365861508119506/epubprivate/OEBPS/Images/48a-i.jpg?sign=1739689602-efCcKqJL5q0saxncuFuEuXZ5mqf13w0M-0-78b405695a413fb5a19a14b68c55170f)
和
![](https://epubservercos.yuewen.com/AE5E39/18365861508119506/epubprivate/OEBPS/Images/48b-i.jpg?sign=1739689602-DNZwpSgfU1tRhbBZbTnjiNzCFNWE2rdV-0-f72909039a3214b1003d12899dd52439)
如果你试一试,就会发现第一个语句没有返回数据,第二个语句返回一行。为什么?
就如第8章所见,LIKE匹配一个完整的列。如果匹配的文本存在于列的值中,LIKE不会找到并且该行不会返回(除非使用通配符)。相反的,REGEXP在列中寻找匹配的值,如果匹配的文本存在于列的值中,REGEXP会找到它并且返回该行。这是一个重要的区别。
那REGEXP可以用来匹配完整的列值吗(以便完成和LIKE一样的功能)?实际上,使用^和$锚点是可以的,见本章后面内容。
提示
匹配时不区分大小写 MariaDB中的正则表达式匹配时不区分大小写(即两种情况都可以匹配)。为了强制区分大小写,你可以使用BINARY关键字,如“WHERE prod_name REGEXP BINARY'JetPack.000'”。