Mysql regexp fails



我试图在表客户中查找名称不包含字母的任何记录。以下是我正在使用的内容。运行时,它不会返回任何找到的记录。有人能指出我的错误吗?

table customers {
name = Еarnings on thе Intеrnet from
}
SELECT name from customers WHERE name NOT REGEXP '[a-zA-Z]' ; 

如果我使用REGEXP '[a-zA-Z]'比较一个字符串,如果字符串中的任何字符与该正则表达式中的一个字母匹配,它就会匹配。显示的字符串确实包含a、r、n、i、g、s等字母。其中任何一个都足以满足REGEXP比较。

mysql> select 'Еarnings on thе Intеrnet from' REGEXP '[a-zA-Z]' as ok;
+----+
| ok |
+----+
|  1 |
+----+
1 row in set (0.00 sec)

否定NOT REGEXPNOT (expr REGEXP pattern)相同。它只是将结果1反转为0,或将结果0反转为1。

mysql> select 'Еarnings on thе Intеrnet from' NOT REGEXP '[a-zA-Z]' as ok;
+----+
| ok |
+----+
|  0 |
+----+

您说过要匹配不包含字母的名称。我想你的意思是,你想匹配包含任何非字母字符的名称,这是一个不同的测试。

mysql> select 'Еarnings on thе Intеrnet from' REGEXP '[^a-zA-Z]' as ok;
+----+
| ok |
+----+
|  1 |
+----+

字符Í•µ不在[a-zA-Z]范围内,表示字符互补范围的方法是使用[^a-zA-Z]。也就是说,如果^字符位于方括号内,则如果该字符不是该范围内的字符之一,则该字符将匹配。

另请参阅https://dev.mysql.com/doc/refman/8.0/en/regexp.html#regexp-项下的语法:

  • [a-dX],[^a-dX]

回复您的评论:

我测试了一下你提到的字符,包括空格、撇号、点和破折号:

mysql> select 'Mr. Tim O''Toole' regexp '[^a-zA-Z '.-]' as ok;
+----+
| ok |
+----+
|  0 |
+----+
mysql> select 'Mr. Tim $ O''Toole' regexp '[^a-zA-Z '.-]' as ok;
+----+
| ok |
+----+
|  1 |
+----+

您不需要在-之前放一个反斜杠,但它确实需要特殊处理:

若要包含文字字符,必须先写或写最后一个。

这在我链接到的文档中。

最新更新