
上QQ阅读APP看书,第一时间看更新
9.2.1 基本字符匹配
我们从简单的例子开始。下面的语句检索列prod_name包含文本1000的所有行:
▼ 输入

▼ 输出

▼ 分析
这个语句看起来像我们使用的LIKE语句(见第8章),除了关键字LIKE被替换为REGEXP。它告知MariaDB接下来的内容被当作正则表达式处理(仅仅匹配文字文本1000)。
那么,为什么还要这么麻烦地使用正则表达式呢?好吧,像在刚才这个例子中,使用正则表达式确实没有什么价值(而且可能会影响性能),然而如果考虑下面这个例子:
▼ 输入

▼ 输出

▼ 分析
这里使用了正则表达式“.000”。“.”是正则表达式语言中的一个特殊字符。它代表任意一个字符,因此1000和2000都能匹配,并且被返回。
当然,这个特殊的例子也可以用LIKE和通配符实现(如第8章所示)。
注意
LIKE和REGEXP LIKE和REGEXP有一个重要的不同点,看下面的两个语句:

和

如果你试一试,就会发现第一个语句没有返回数据,第二个语句返回一行。为什么?
就如第8章所见,LIKE匹配一个完整的列。如果匹配的文本存在于列的值中,LIKE不会找到并且该行不会返回(除非使用通配符)。相反的,REGEXP在列中寻找匹配的值,如果匹配的文本存在于列的值中,REGEXP会找到它并且返回该行。这是一个重要的区别。
那REGEXP可以用来匹配完整的列值吗(以便完成和LIKE一样的功能)?实际上,使用^和$锚点是可以的,见本章后面内容。
提示
匹配时不区分大小写 MariaDB中的正则表达式匹配时不区分大小写(即两种情况都可以匹配)。为了强制区分大小写,你可以使用BINARY关键字,如“WHERE prod_name REGEXP BINARY'JetPack.000'”。